Sobes.tech
Middle+

რა იცით Flutter-ის შიდა მოწყობის შესახებ?

sobes.tech AI

პასუხი AI-სგან

Flutter-ის ბირთვი შედგება ძრავის, ჩარჩოსა და ვიჯეტებისგან.

  • Flutter-ის ძრავი: დაწერილია C++-ში და უზრუნველყოფს დაბალ დონეზე API-ს რენდერინგისთვის, ტექსტთან მუშაობისთვის, ნაკადებისა და პლაგინებისთვის. ის პირდაპირ ურთიერთქმედებს პლატფორმასთან (iOS, Android, Web, Desktop) და გრაფიკული API-ებთან (მაგალითად, Skia). ძრავი მართავს გამოსახულების გადაღებას, ასინქრონულ ოპერაციებს და აპლიკაციის ციკლს.

  • Flutter-ის ჩარჩო (Framework): დაწერილია Dart-ით და უზრუნველყოფს abstraction-ის ფენას ძრავზე. მასში შედის მრავალი მზადყოფნის კომპონენტი:

    • Foundation: ძირითადი კლასი და დახმარებითი ფუნქციები.
    • Rendering: ფენა, რომელიც მართავს ობიექტების ხეს და მათი გამოსახულების გადაღებას.
    • Widgets: UI-ის ძირითადი ბლოკები, რომლებიც ქმნიან ვიჯეტების ხეს.
    • Material Design და Cupertino: ვიჯეტების ნაკრები, რომელიც განახორციელებს Material Design-ის სტილებს და iOS-ის დიზაინს.
  • ვიჯეტები: Flutter-ში ყველაფერი ვიჯეტია. ვიჯეტები აღწერენ UI-ის კონფიგურაციას. არსებობს ორი ძირითადი ტიპი:

    • StatelessWidget: ვიჯეტი, რომელსაც არ აქვს შიდა შეცვლადი მდგომარეობა. მისი UI დამოკიდებულია მხოლოდ მის შემომავალ პარამეტრებზე (properties).
    • StatefulWidget: ვიჯეტი, რომელსაც შეუძლია ჰქონდეს შეცვლადი მდგომარეობა. ის შედგება თავად ვიჯეტისა და State ობიექტისგან, სადაც ინახება მდგომარეობა და UI-ის მშენებლობის ლოგიკა (build მეთოდი).

რენდერინგის პროცესი:

  1. Build: ფრეიმვორკი იძახის build() მეთოდს ვიჯეტზე, რომელიც აბრუნებს სხვა ვიჯეტების ხეს.
  2. Element Tree: ვიჯეტების ხის საფუძველზე იქმნება ელემენტების ხე (Element Tree), რომელიც წარმოადგენს UI-ის სტრუქტურას. ელემენტები აკავშირებენ ვიჯეტებს შესაბამის ობიექტებთან რენდერინგისთვის.
  3. Render Object Tree: ელემენტები ქმნიან და მართავენ რენდერ ობიექტების ხეს (Render Object Tree). რენდერ ობიექტები პასუხისმგებელნი არიან მორგებაზე, ფერადზე და hit testing-ზე.
  4. Painting: ძრავი იყენებს Skia-ს (მობილურ და დესკტოპ პლატფორმებზე) ან CanvasKit-ს (ვებსაიტზე) Render Objects-ის გამოსახატავად ეკრანზე.

რეაქტიული პროგრამირება:

Flutter იყენებს რეაქტიულ მიდგომას UI-ის მშენებლობაში. როდესაც აპლიკაციის მდგომარეობა იცვლება, ფრეიმვორკი აღადგენს იმ ნაწილს ვიჯეტების ხის, რომელიც ამ მდგომარეობაზეა დამოკიდებული. ეს ხდება ავტომატურად და ეფექტურად diffing-ის მექანიზმის და სწრაფი ვიჯეტების შექმნისა და განადგურების საშუალებით.

გახმოვანება (Hot Reload) და სწრაფი გადატვირთვა (Hot Restart):

  • Hot Reload: აყენებს განახლებულ Dart კოდს უკვე გაშვებულ აპლიკაციაში, მდგომარეობის დაკარგვის გარეშე. იდეალურია UI-ის სწრაფი ინტერაციისთვის.
  • Hot Restart: თავიდან იწყებს აპლიკაციას განახლებულ კოდთან და ნულიდან, განულებული მდგომარეობით. გამოიყენება, როდესაც Hot Reload ვერ მუშაობს, მაგალითად, initState-ში ცვლილებების ან გლობალური ცვლადების ცვლილების დროს.

პლატფორმის სპეციფიკური კოდი:

Flutter-ის საშუალებით შესაძლებელია ურთიერთქმედება პლატფორმის ნატიური API-ებთან პლატფორმის არხების (Platform Channels) მეშვეობით. ეს საშუალებას აძლევს იძახოს ნატიური კოდის მეთოდები (Java/Kotlin Android-ზე, Swift/Objective-C iOS-ზე) და მიიღოს შედეგები Dart-ში.

// მაგალითი პლატფორმის არხის გამოყენების
import 'package:flutter/services.dart';

static const platform = MethodChannel('samples.flutter.dev/battery');

Future<void> getBatteryLevel() async {
  String batteryLevel;
  try {
    final int result = await platform.invokeMethod('getBatteryLevel');
    batteryLevel = 'ბატარეის დონე: $result %.';
  } on PlatformException catch (e) {
    batteryLevel = "ვერ მოხერხდა ბატარეის დონის მიღება: '${e.message}'.";
  }
  // UI-ის განახლება
}