مقالات برنامه نویسی

آشنایی با سوالات استخدامی برنامه نویس فلاتر

هر شرکتی برای استخدام نیروهای خود دارای یک یا چند مصاحبه فنی می باشند که در طی این جلسات با توانمندی های متقاضیان در زمینه مورد نظر آشنا می شوند.

اگر سابقه شرکت در جلسات مصاحبه استخدامی را ندارید ممکن است با سوالات پر تکراری که پرسیده می شوند آشنا نباشید به همین دلیل این مقاله میتونه شمارو با شرایط مصاحبه های استخدامی به خصوص برای موقعیت شغلی برنامه نویسی فلاتر آماده بکنه.

اگر هم قصد انجام مصاحبه استخدامی ندارید با جواب دادن به سوال ها میتونید خودتون و محک بزنی.

در بخش به سراغ سوالات تئوری با جواب های کوتاه میرویم.

سوالات تئوری فلاتر

  • چه زمانی از WidgetsBindingObserver استفاده میکنیم؟
  • کاربرد tree shaking چیست؟
  • تفاوت hot restart و hot reload چیست؟
  • PageRoute چیست؟
  • این سه موارد را توضیح دهید async, await و Future
  • چه زمانی از keys استفاده میکنید.
  • چه زمانی از double.INFINITY استفاده می شود؟
  • ویجت AspectRatio چه کاربردی دارد؟
  • چند نوع عملیات نام ببرید که نیازمند مقدار بازگشتی از نوع Future است.
  • تفاوت SizedBox و Container
  • برای کارکرد صحیح CrossAxisAlignment.baseline نیاز به چه مواردی داریم؟
  • تفاوت Single Instance و Scoped Instance چیست؟

سوالات بخش تئوری میتونه به شکل موارد بالا باشه و فقط نیاز به توضیحات مختصر است.

در بخش بعدی به سراغ سوالات کدنویسی میرویم.

سوالات برنامه نویس تازه کار فلاتر

سوالات این بخش مخصوص استخدام برنامه نویسان تازه کار و جوان هستند به همین دلیل دارای پیچیدگی های کمتری هستند.

سوال 1) کلاس زیر را در نظر بگیرید:

class Recipe {
  int cows;
  int trampolines;

  Recipe(this.cows, this.trampolines);
  
  int makeMilkshake() {
    return cows + trampolines;
  }
}

متد makeMilkshake() را به شکل کوتاه تر و به فرمت Getter با نام milkshake بازنویسی کنید.

پاسخ: اگر متد شما دارای فقط یک خط کد هست میتونید مقدار بازگشتی را کمک “=>” بازنویسی کنید.

int get milkshake => cows + trampolines;

سوال2) ویجت زیر را در نظر بگیرید:

class MyWidget extends StatelessWidget {
  final personNextToMe = 'That reminds me about the time when I was ten and our neighbor, her name was Mrs. Mable, and she said...';

  @override
  Widget build(BuildContext context) {
    return Row(children: [
      Icon(Icons.airline_seat_legroom_reduced),
      Text(personNextToMe),
      Icon(Icons.airline_seat_legroom_reduced),
    ]);
  }
}

خروجی کد بالا به شکل زیر هست و میبینید که مشکل overflow در قسمت سمت راست گوشی ایجاد کرده است. این مشکل را چگونه حل میکنید؟

پاسخ: برای رفع این مشکل ویجت Text را باید داخل ویجت Expanded قرار دهید.

Expanded(
  child: Text(
    personNextToMe,
  ),
),

سوال 3) کد زیر را به شکلی تغییر دهید که اگر اندازه ویجت های فرزند داخل Row زیاد شد بقیه ویجت ها در خط بعدی نمایش داده شوند.

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Row(children: [
      Chip(label: Text('I')),
      Chip(label: Text('really')),
      Chip(label: Text('really')),
      Chip(label: Text('really')),
      Chip(label: Text('really')),
      Chip(label: Text('really')),
      Chip(label: Text('really')),
      Chip(label: Text('need')),
      Chip(label: Text('a')),
      Chip(label: Text('job')),
    ]);
  }
}

پاسخ: برای انجام این کار در فلاتر تمام کاری که نیاز دارید انجام دهید قرار دادن row داخل ویجت wrap می باشد.

سوال 4) در کد زیر سه نوع لیست به روش های مختلف تعریف کرده ایم.

لیست اول با استفاده از کلمه var, لیست دوم با کلمه final و لیست سوم با استفاده از const تعریف شده است.

تفاوت این سه لیست چیست؟ آیا دو لیست آخر کامپایل می شوند؟

var list1 = ['I', 'Hi', 'Flutter'];

final list2 = list1;
list2[2] = 'Dart';   // Will this line compile?
  
const list3 = list1; // Will this line compile?

پاسخ: زمانی که از کلمه var استفاده میکنید نوع دیتا توسط مقدار قرار داده شده تعیین میشود همچنین میتوانید مقدار متغیر را تغییر دهید.

زمانی که از const و final برای تعریف متغیر استفاده میکنید امکان تغییر مقدار قرار داده شده را ندارید.

خط سوم برنامه کامپایل نمیشود به دلیل اینکه در حال تغییر دادن ایندکس سوم هستید در حالی که لیست شما از نوع final است.

سوالات برنامه نویس متوسط فلاتر

در این بخش سوالاتی مطرح میکنیم که بیشتر مربوط به استخدام برنامه نویسانی با سابقه کاری متوسط می باشد.

سوال 1) شما در حال ساخت یک اپلیکیشن فروشگاهی هستید کار آن فروش عروسک می باشد.

این برنامه دارای یک باگ است, اگر مشتری در صفحه خرید عروسک های آبی و قرمز را انتخاب کند زمانی که قصد حذف کردن عروسک آبی را داشته باشد بعد از حذف آن مقدار عروسک قرمز سفارش اشتباه میشود.

این مشکل را حل کنید. کد صفحه در پایین قرار داده شده است.

class OrderPage extends StatefulWidget {
  @override
  _OrderPageState createState() => _OrderPageState();
}

class _OrderPageState extends State<OrderPage> {
  bool isShowing = true;
  @override
  Widget build(BuildContext context) {
    return Column(children: [
      RaisedButton(
        child: (Text('Delete blue')),
        onPressed: () {
          setState(() {
            isShowing = false;
          });
        },
      ),
      if (isShowing) CounterButton(color: Colors.blue),
      CounterButton(color: Colors.red),
    ]);
  }
}

پاسخ: زمانی که یک stateful widget دارید و تغییری روی آن انجام میشود فریمورک فلاتر نوع ویجت ها را باهم مقایسه میکند تا بتواند از بعضی آنها به شکل دوباره استفاده کند.

به دلیل اینکه هر دو CounterButton از یک نوع ویجت هستند فلاتر متوجه نمیشود که کدام یکی از آن دو را به state اختصاص دهد.

برای رفع این مشکل از ویژگی key برای هر ویجت استفاده میکنیم تا بین آنها تفاوت ایجاد شود.

CounterButton(
  key: ValueKey('red'),
  color: Colors.red,
),

سوال 2) آدرس زیر یک API است که لیستی از مشاغل را نمایش میدهد.

با استفاده از این وب سرویس یک متد ایجاد کنید که مقدار بازگشتی Future داشته و لیست مشاغل را نمایش دهد.

فقط نام کمپانی و عنوان شغلی کافیست, نیاز به مدیریت خطا نیست.

پاسخ: ابتدا کلا مدل خود را ایجاد میکنیم.

class Job {
  Job(this.company, this.title);

  Job.fromJson(Map<String, dynamic> json)
      : company = json['company'],
        title = json['title'];

  final String company;
  final String title;
}

برای بخش ارتباط با سرور از پکیج http استفاده میکنیم که قبلا داخل سایت آموزش آن را قرار داده ایم.

ارتباط با سرور و API در فلاتر

در نهایت متد مورد نظر برای دریافت اطلاعات را به شکل زیر تکمیل میکنیم.

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<Job>> fetchJobs() async {
  final host = 'jobs.github.com';
  final path = 'positions.json';
  final queryParameters = {'location': 'remote'};
  final headers = {'Accept': 'application/json'};
  final uri = Uri.https(host, path, queryParameters);
  final results = await http.get(uri, headers: headers);
  final jsonList = json.decode(results.body) as List;
  return jsonList.map((job) => Job.fromJson(job)).toList();
}

سوال 3) یک استریم داریم که بصورت نامحدود رشته هایی با نام salmon, trout تولید میکند.

این استریم را به شکلی تغییر دهید که برای 5 رشته اول از نوع salmon عبارت sushi را منتشر کند.

final fishStream = FishHatchery().stream; 
// salmon, trout, trout, salmon, ...

پاسخ: برای انجام این کار کافیست به شکل زیر عمل کنید.

final fishStream = FishHatchery().stream;
final sushiStream = fishStream
    .where((fish) => fish == 'salmon')
    .map((fish) => 'sushi')
    .take(5);

برای این بخش هم تعدادی سوالات توری و شفاهی قرار داده ایم, اما برای پیدا کردن جواب آنها باید به توانایی های خودتان اتکا کنید.

  • چه راهکاری برای کاهش تعداد دفعات build شده دوباره ویجت ها وجود دارد؟
  • BuildContext چیست و چه کاربردی دارد؟
  • event loop چیست و چه ارتباطی با isolates دارد؟
  • برای فراخوانی کدهای نیتیو به چه شکلی عمل میکنید؟
  • ScopedModel چیست؟
  • چرا در انیمیشن نیاز به mixins داریم؟
  • تفاوت getDocuments() و snapshots()؟
  • انوع استریم را توضیح دهید.

سوالات برنامه نویس ارشد فلاتر

سوال 1) با کامل کردن مراحل خواسته شده ارتباط isolate را در فلاتر شرح دهید.

متدی به نام downloadAndCompressTheInternet() ایجاد کنید مقدار 42 را بازگرداند و آنرا به یک isolate اختصاص دهید.

پاسخ: ابتدا یک پورت برای دریافت اطلاعات از isolate ایجاد میکنیم.

در قسمت دوم یک isolate میسازیم و کارهایی را انجام دادن به آن میسپازیم.مثل برگرداندن اطلاعات.

در بخش سوم اطلاعات ارسالی توسط isolate را دریافت میکینم.

import 'dart:isolate';

void main() async {
  // 1
  final receivePort = ReceivePort();
  // 2
  final isolate = await Isolate.spawn(
    downloadAndCompressTheInternet,
    receivePort.sendPort,
  );
  // 3
  receivePort.listen((message) {
    print(message);
    receivePort.close();
    isolate.kill();
  });
}

// 4
void downloadAndCompressTheInternet(SendPort sendPort) {
  sendPort.send(42);
}

در این مطلب سعی کردیم سوالهای متنوعی را برای شما دوستان قرار دهیم تا مفید باشه واستون.

Hesam

Recent Posts

گیتهاب اکشن چیست؟ آموزش استفاده از گیتهاب اکشن در برنامه نویسی فلاتر

گیتهاب اکشن GitHub Actions یکی از ابزارهای گیتهاب است که به شما کمک می‌کنه تا…

2 هفته ago

آموزش افزایش سرعت اجرای وب اپلیکیشن های فلاتر

اگر یک برنامه نویس فلاتر هستید و با از نسخه وب اپلیکیشن پروژتون استفاده میکنید…

1 ماه ago

آموزش جامع انتشار اپلیکیشن اندروید و فلاتر در فروشگاه گوگل پلی Google play

به عنوان یک برنامه نویس فلاتر یا اندروید بعد از اتمام پروسه طراحی اپلیکیشن نیاز…

2 ماه ago

دانلود سورس کد رابط کاربری اپلیکیشن فلاتر پروژه پادکست

طراحی رابط کاربری اپلیکیشن پادکست خود را با استفاده از این کیت توسعه UI/UX فلاتر…

3 ماه ago

فایربیس چیست؟ معرفی سرویس ابری Firebase و کاربردهای آن

فایربیس، پلتفرمی قدرتمند از شرکت گوگل برای توسعه و مدیریت برنامه‌های موبایل و وب است.…

3 ماه ago

آموزش پیاده سازی Method Channel در فلاتر + فیلم

فلاتر یک فریم ورک برنامه نویسی چندسکویی است که این امکان را برای برنامه نویس…

3 ماه ago