Sobes.tech
Junior

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ă Model din pachetul scoped_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 Model din cel mai apropiat ScopedModel de 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:

  1. 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
      }
    }
    
  2. Î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(),
          ),
        );
      }
    }
    
  3. 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.