La ce se folosește Scoped Model în Flutter?
sobes.tech AI
Răspuns de la AI
Scoped Model este o bibliotecă simplă pentru gestionarea stării în Flutter, bazată pe conceptul de InheritedWidget. Este proiectată pentru a oferi acces la date (model) și posibilitatea de a le modifica widget-urilor din arbore fără a fi nevoie să transmită explicit datele prin constructori la fiecare nivel.
Componentele principale ale Scoped Model:
- Model: Clasa care stochează datele și logica de business. Trebuie să extindă
Modeldin pachetulscoped_model. - ScopedModel: Widget care înfășoară o parte a arborelui de widget-uri. Primește o instanță de
Modelși o face accesibilă pentru sine și descendenții săi. - ScopedModelDescendant: Widget care permite accesul la instanța de
Modeldin cel mai apropiatScopedModelde deasupra în arbore și se abonează la modificările sale.
Avantajele utilizării Scoped Model:
- Simplitate: Ușor de înțeles și de folosit, mai ales pentru aplicații mici și medii.
- Bazat pe mecanismele standard ale Flutter: Utilizează InheritedWidget, ceea ce îl face eficient.
- Bine documentat: Documentație exhaustivă și exemple disponibile.
Exemplu de utilizare:
-
Crearea unui model:
import 'package:scoped_model/scoped_model.dart'; class CounterModel extends Model { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); // Notifică widget-urile despre schimbare } } -
Învelirea unei părți a arborelui în
ScopedModel:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Importă modelul void main() { runApp( // Învelim aplicația noastră în ScopedModel ScopedModel<CounterModel>( model: CounterModel(), child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Exemplu Scoped Model')), body: Center( child: CounterDisplay(), ), floatingActionButton: IncrementButton(), ), ); } } -
Accesarea modelului în
ScopedModelDescendant:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Importă modelul class CounterDisplay extends StatelessWidget { @override Widget build(BuildContext context) { // Acces la model și abonare la modificări 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) { // Acces la model fără abonare la modificări return FloatingActionButton( onPressed: () { ScopedModel.of<CounterModel>(context).increment(); }, child: Icon(Icons.add), ); } }
Scoped Model este potrivit pentru aplicații în care gestionarea stării nu este prea complexă și se poate renunța la soluții mai puternice, dar mai verbose, precum BLoC sau Riverpod. Totuși, pentru aplicații mari și complexe cu multiple stări interconectate, pot fi necesare abordări mai avansate.