Sobes.tech
Junior

Ի՞նչ նպատակով է օգտագործվում Scoped Model-ը Flutter-ում։

sobes.tech AI

Պատասխան AI-ից

Scoped Model-ը պարզ գրադարան է Flutter-ում վիճակի կառավարման համար, որը հիմնված է InheritedWidget կոնցեպտի վրա: Այն տրամադրում է տվյալների (մոդելի) հասանելիություն և նրանց փոփոխության հնարավորությունը widget-ներին ենթաբաղադրամասում՝ առանց անհրաժեշտության բացահայտ փոխանցելու տվյալները կոնստրուկտորների միջոցով յուրաքանչյուր մակարդակում:

Scoped Model-ի հիմնական բաղադրիչները՝

  • Model: Կլաս, որը պահում է տվյալները և բիզնես-լոգիկան: Նա պետք է ընդլայնի Modelscoped_model փաթեթից:
  • ScopedModel: Widget, որը շրջապատում է ծառի մի մասը: Նա ընդունում է Model-ի օրինակ և դարձնում այն հասանելի իր և իր ժառանգների համար:
  • ScopedModelDescendant: Widget, որը թույլ է տալիս ստանալ մոտակա ScopedModel-ից Model-ի օրինակ և գրանցվել նրա փոփոխությունների համար:

Scoped Model-ի օգտագործման առավելությունները՝

  • Պարզություն: Հասկանալի և հեշտ օգտագործել, հատկապես փոքր և միջին հավելվածների համար:
  • Հիմնված է Flutter-ի ստանդարտ մեխանիզմների վրա: Օգտագործում է InheritedWidget-ը, ինչը դարձնում է արդյունավետ:
  • Լավ փաստաթղթավորված: Կան մանրամասն փաստաթղթեր և օրինակներ:

Օգտագործման օրինակ՝

  1. Մոդել ստեղծել:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Հաղորդում է widget-ներին փոփոխության մասին
      }
    }
    
  2. Մոտակա ScopedModel-ով շրջապատել ծառի մի մասը:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Մոդելի ներմուծում
    
    void main() {
      runApp(
        // Մեր հավելվածը շրջապատել `ScopedModel`-ով
        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 Example')),
            body: Center(
              child: CounterDisplay(),
            ),
            floatingActionButton: IncrementButton(),
          ),
        );
      }
    }
    
  3. Մուտք գործել մոդել ScopedModelDescendant-ով:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Մոդելի ներմուծում
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Մուտք գործել մոդել և գրանցվել նրա փոփոխությունների համար
        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) {
        // Մուտք գործել մոդել առանց փոփոխությունների գրանցման
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model-ը հարմար է այն հավելվածների համար, որտեղ վիճակի կառավարումը շատ բարդ չէ և կարելի է խուսափել ավելի հզոր, բայց և ավելի շատ բառեր պահանջող լուծումներից՝ ինչպիսիք են BLoC կամ Riverpod: Սակայն մեծ և բարդ հավելվածների համար, որտեղ շատ փոխկապակցված վիճակներ կան, կարող են անհրաժեշտ լինել ավելի առաջադեմ մոտեցումներ։