Sobes.tech
Junior

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 Model do pacote scoped_model.
  • ScopedModel: Widget que envolve uma parte da árvore de widgets. Aceita uma instância de Model e torna-a acessível a si próprio e aos seus descendentes.
  • ScopedModelDescendant: Widget que permite aceder à instância de Model do ScopedModel mais 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:

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