Zašto se koristi Scoped Model u Flutteru?
sobes.tech АИ
Одговор од АИ
Scoped Model je jednostavna biblioteka za upravljanje stanjima u Flutter-u, zasnovana na konceptu InheritedWidget. Omogućava pristup podacima (modelu) i njihovu izmenu widget-ima u podstablu bez potrebe za eksplicitnim prenošenjem podataka kroz konstruktore na svakoj razini.
Glavne komponente Scoped Model-a:
- Model: Klasa koja čuva podatke i poslovnu logiku. Treba da proširuje
Modeliz paketascoped_model. - ScopedModel: Widget koji obuhvata deo stabla widget-a. Prima instancu
Modeli čini je dostupnom sebi i svojim potomcima. - ScopedModelDescendant: Widget koji omogućava pristup instanci
Modeliz najbližegScopedModeliznad u stablu i pretplatu na njegove promene.
Prednosti korišćenja Scoped Model:
- Jednostavnost: Lako za razumevanje i korišćenje, posebno za manje i srednje aplikacije.
- Zasnovano na standardnim mehanizmima Flutter-a: Koristi InheritedWidget, što ga čini efikasnijim.
- Dobro dokumentovano: Dostupna je iscrpna dokumentacija i primeri.
Primer korišćenja:
-
Kreiranje modela:
import 'package:scoped_model/scoped_model.dart'; class CounterModel extends Model { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); // Obaveštava widget-e o promeni } } -
Obuhvatiti deo stabla
ScopedModel-om:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Uvoz modela void main() { runApp( // Obuhvatiti našu aplikaciju ScopedModel-om 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 Primer')), body: Center( child: CounterDisplay(), ), floatingActionButton: IncrementButton(), ), ); } } -
Pristup modelu putem
ScopedModelDescendant:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Uvoz modela class CounterDisplay extends StatelessWidget { @override Widget build(BuildContext context) { // Dobijanje pristupa modelu i pretplata na njegove promene 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) { // Dobijanje pristupa modelu bez pretplate na promene return FloatingActionButton( onPressed: () { ScopedModel.of<CounterModel>(context).increment(); }, child: Icon(Icons.add), ); } }
Scoped Model je pogodan za aplikacije gde upravljanje stanjem nije previše složeno i može se izbeći korišćenje moćnijih, ali i složenijih rešenja poput BLoC ili Riverpod. Međutim, za veće i složenije aplikacije sa velikim brojem međusobno povezanih stanja, mogu biti potrebni napredniji pristupi.