Do czego służy Scoped Model w Flutterze?
sobes.tech AI
Odpowiedź od AI
Scoped Model to prosta biblioteka do zarządzania stanem w Flutter, oparta na koncepcji InheritedWidget. Ma na celu zapewnienie dostępu do danych (modelu) i możliwości ich modyfikacji widgetom w drzewie bez konieczności jawnego przekazywania danych przez konstruktory na każdym poziomie.
Główne komponenty Scoped Model:
- Model: Klasa przechowująca dane i logikę biznesową. Powinna rozszerzać
Modelz pakietuscoped_model. - ScopedModel: Widget otaczający część drzewa widgetów. Przyjmuje instancję
Modeli czyni ją dostępną dla siebie i swoich potomków. - ScopedModelDescendant: Widget umożliwiający dostęp do instancji
Modelz najbliższegoScopedModelpowyżej w drzewie i subskrypcję jego zmian.
Zalety korzystania z Scoped Model:
- Prostota: Łatwy do zrozumienia i używania, szczególnie dla małych i średnich aplikacji.
- Oparte na standardowych mechanizmach Flutter: Używa InheritedWidget, co czyni go wydajnym.
- Dobrze udokumentowany: Dostępna obszerna dokumentacja i przykłady.
Przykład użycia:
-
Utwórz model:
import 'package:scoped_model/scoped_model.dart'; class CounterModel extends Model { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); // Powiadamiamy widgety o zmianie } } -
Otocz część drzewa
ScopedModel:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Import modelu void main() { runApp( // Otaczamy naszą aplikację ScopedModel ScopedModel<CounterModel>( model: CounterModel(), child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Przykład Scoped Model')), body: Center( child: CounterDisplay(), ), floatingActionButton: IncrementButton(), ), ); } } -
Uzyskaj dostęp do modelu w
ScopedModelDescendant:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Import modelu class CounterDisplay extends StatelessWidget { @override Widget build(BuildContext context) { // Uzyskuj dostęp do modelu i subskrybuj jego zmiany return ScopedModelDescendant<CounterModel>( builder: (context, child, model) { return Text( 'Licznik: ${model.counter}', style: Theme.of(context).textTheme.headline4, ); }, ); } } class IncrementButton extends StatelessWidget { @override Widget build(BuildContext context) { // Uzyskuj dostęp do modelu bez subskrypcji zmian return FloatingActionButton( onPressed: () { ScopedModel.of<CounterModel>(context).increment(); }, child: Icon(Icons.add), ); } }
Scoped Model jest odpowiedni dla aplikacji, w których zarządzanie stanem nie jest zbyt skomplikowane i można obejść się bez bardziej zaawansowanych, ale i bardziej rozbudowanych rozwiązań, takich jak BLoC czy Riverpod. Jednak w dużych i złożonych aplikacjach z wieloma powiązanymi stanami mogą być konieczne bardziej zaawansowane podejścia.