Para que é que o Modelo Scoped é utilizado no Flutter?
sobes.tech IA
Resposta da IA
Scoped Model é uma biblioteca simples para gerir o estado no Flutter, baseada no conceito de InheritedWidget. Destina-se a fornecer acesso aos dados (modelo) e a capacidade de os modificar aos widgets na árvore sem necessidade de passar explicitamente os dados através de construtores em cada nível.
Componentes principais do Scoped Model:
- Model: Classe que armazena dados e lógica de negócio. Deve estender
Modeldo pacotescoped_model. - ScopedModel: Widget que envolve uma parte da árvore de widgets. Aceita uma instância de
Modele torna-a acessível a si próprio e aos seus descendentes. - ScopedModelDescendant: Widget que permite aceder à instância de
ModeldoScopedModelmais próximo acima na árvore e subscrever-se às suas alterações.
Vantagens do uso do Scoped Model:
- Simplicidade: Fácil de entender e usar, especialmente para aplicações pequenas e médias.
- Baseado em mecanismos padrão do Flutter: Utiliza InheritedWidget, o que o torna eficiente.
- Bem documentado: Documentação exaustiva e exemplos disponíveis.
Exemplo de uso:
-
Criar um modelo:
import 'package:scoped_model/scoped_model.dart'; class CounterModel extends Model { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); // Notifica os widgets sobre a alteração } } -
Envolver parte da árvore em
ScopedModel:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Importa o modelo void main() { runApp( // Envolver a nossa aplicação em ScopedModel ScopedModel<CounterModel>( model: CounterModel(), child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Exemplo Scoped Model')), body: Center( child: CounterDisplay(), ), floatingActionButton: IncrementButton(), ), ); } } -
Aceder ao modelo em
ScopedModelDescendant:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Importa o modelo class CounterDisplay extends StatelessWidget { @override Widget build(BuildContext context) { // Acede ao modelo e subscreve-se às suas alterações 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) { // Acede ao modelo sem subscrever-se às alterações return FloatingActionButton( onPressed: () { ScopedModel.of<CounterModel>(context).increment(); }, child: Icon(Icons.add), ); } }
Scoped Model é adequado para aplicações onde a gestão do estado não é demasiado complexa e pode dispensar soluções mais poderosas, mas mais verbosas, como BLoC ou Riverpod. No entanto, para aplicações grandes e complexas com múltiplos estados interligados, podem ser necessários abordagens mais avançadas.