Sobes.tech
Junior

Flutter'da Scoped Model nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

Scoped Model Flutterda ich ichiq vaqti boshqarish uchun InheritedWidget konseptsiyasiga asoslangan oddiy kutubxonadir. U ma'lumotlarga (modelga) kirishni ta'minlaydi va uni har bir darajadagi konstruktorlar orqali aniq o'tkazmasdan, daraxtdagi vidjetlarga kirish va ularni o'zgartirish imkonini beradi.

Scoped Model ning asosiy komponentlari:

  • Model: Ma'lumotlar va biznes mantiqini saqlovchi sinf. U scoped_model paketidan Model ni kengaytirishi kerak.
  • ScopedModel: Vidjet, u vidjetlar daraxtining bir qismini o'z ichiga oladi. U Model ning nusxasini oladi va uni o'ziga va uning vorislarga mavjud qiladi.
  • ScopedModelDescendant: Vidjet, u eng yaqin ScopedModel dan Model nusxasiga kirishni ta'minlaydi va uning o'zgarishlariga obuna bo'ladi.

Scoped Model ni ishlatishning afzalliklari:

  • Soddalik: Tushunarli va foydalanish oson, ayniqsa kichik va o'rta hajmdagi ilovalar uchun.
  • Flutter ning standart mexanizmlariga asoslangan: InheritedWidget ni ishlatadi, bu uni samarali qiladi.
  • Yaxshi hujjatlashtirilgan: To'liq hujjat va misollar mavjud.

Foydalanish misoli:

  1. Model yaratish:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Vidjetlarga o'zgarishlar haqida xabar berish
      }
    }
    
  2. Modelning bir qismini ScopedModel bilan o'rab olish:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Modelni import qilish
    
    void main() {
      runApp(
        // Ilovamizni ScopedModel bilan o'rab olamiz
        ScopedModel<CounterModel>(
          model: CounterModel(),
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Scoped Model misoli')),
            body: Center(
              child: CounterDisplay(),
            ),
            floatingActionButton: IncrementButton(),
          ),
        );
      }
    }
    
  3. ScopedModelDescendant ichida modelga kirish:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Modelni import qilish
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Modelga kirish va uning o'zgarishlariga obuna bo'lish
        return ScopedModelDescendant<CounterModel>(
          builder: (context, child, model) {
            return Text(
              'Counter: ${model.counter}',
              style: Theme.of(context).textTheme.headline4,
            );
          },
        );
      }
    }
    
    class IncrementButton extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Modelga kirish, lekin o'zgarishlarga obuna bo'lmasdan
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model, holat boshqaruvi juda murakkab bo'lmagan va BLoC yoki Riverpod kabi kuchliroq, ammo ko'proq yozuvli yechimlardan foydalanishni istamagan ilovalar uchun mos keladi. Biroq, katta va murakkab ilovalarda, ko'plab o'zaro bog'langan holatlarni boshqarish uchun yanada ilg'or yondashuvlar talab qilinishi mumkin.