Flutter kontekstida Dartda ikki ipni qanday yaratish mumkin?
sobes.tech AI
AIdan javob
Dart/Flutter'da mustaqil bajarish oqimlarini yaratish uchun Izolatlar (Isolates) ishlatiladi. Ular o'ziga xos ajratilgan xotira bo'shlig'iga ega bo'lgan alohida vazifalar bo'lib, bu ma'lumotlarga kirishda muammolar va asosiy oqim (UI oqimi)ning bloklanishini oldini oladi.
Izolatlar bilan ishlashning bir nechta usullari mavjud:
-
Isolate.spawn(): Izolatni yaratish uchun pastki darajadagi usul. Bu yangi izolatda bajariladigan yuqori darajadagi funktsiya yoki statik metod va xabar almashish uchun portni o'tkazishni talab qiladi.import 'dart:isolate'; // Izolatda bajariladigan funktsiya void isolateEntry(SendPort sendPort) { int result = 0; for (int i = 0; i < 1000000000; i++) { result += i; } sendPort.send(result); } void main() async { ReceivePort receivePort = ReceivePort(); Isolate isolate = await Isolate.spawn(isolateEntry, receivePort.sendPort); receivePort.listen((message) { print('Izolat natijasi: $message'); isolate.kill(); }); print('Asosiy oqim ishlashda davom etmoqda...'); } -
compute():flutter/foundationpaketidan soddalashtirilgan funktsiya, uIsolate.spawn()ni ichki ishlatadi. Oddiy fon vazifalari uchun idealdir.import 'package:flutter/foundation.dart'; int heavyComputation(int limit) { int result = 0; for (int i = 0; i < limit; i++) { result += i; } return result; } void main() async { int result = await compute(heavyComputation, 1000000000); print('Hisoblash natijasi: $result'); } -
Isolate.spawnUri(): Bu kodni alohida Dart faylidan yangi izolatda ishga tushirish uchun ishlatiladi.
Izolatlar o'rtasida muloqot:
Izolatlar faqat xabar yuborish orqali SendPort va ReceivePort instansiyalari yordamida ma'lumot almashadi. Bu operatsiyalar atomik bo'lib, blokirovka yoki boshqa sinxronizatsiya mexanizmlarini talab qilmaydi.
SendPort: Bir izolatdan boshqasiga xabar yuborish uchun ishlatiladi.ReceivePort: Kiruvchi xabarlarni tinglash uchun ishlatiladi.
Izolatlar o'rtasida ob'ektlarni o'tkazishda, ular "o'tkaziladigan" bo'lishi kerak, bu quyidagilarni o'z ichiga oladi:
- Oddiy ma'lumot turlari (int, double, String, bool)
- O'tkaziladigan turlarni o'z ichiga olgan ro'yxatlar va xaritalar
- Ba'zi Flutter uchun maxsus turlar, serializatsiya qilinishi mumkin
O'tkazilmaydigan ob'ektlar nusxalanadi va ularning keyingi o'zgarishlari bir izolatda boshqa izolatga ta'sir qilmaydi.
Asosiy nuqtalar:
- Izolatlar bir-birining xotirasiga to'g'ridan-to'g'ri kira olmaydi.
- Ular umumiy holatga, o'zgaruvchilarga, sinflarga va asosiy izolat (UI oqimi) widgetlariga kirish huquqiga ega emas.
- Izolatlar o'rtasidagi muloqot asinxron tarzda amalga oshiriladi.
- Flutterda izolatlar bilan ishlashda, ularning hayot aylanishini to'g'ri boshqarish muhim (masalan,
isolate.kill()dan foydalanish).
Izolatlar yordamida uzoq davom etadigan yoki resurslarni ko'p talab qiladigan operatsiyalarni fon rejimida bajarish mumkin, bu esa foydalanuvchi interfeysining to'xtashini oldini oladi va ilovaning silliq ishlashini ta'minlaydi.