Для чего используется Scoped Model в Flutter?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Scoped Model - это простая библиотека для управления состоянием во Flutter, основанная на концепции InheritedWidget. Она предназначена для предоставления доступа к данным (модели) и возможности их изменения виджетам в поддереве без необходимости явно передавать данные через конструкторы на каждом уровне.
Основные компоненты Scoped Model:
- Model: Класс, который хранит данные и бизнес-логику. Он должен расширять
Modelиз пакетаscoped_model. - ScopedModel: Виджет, который оборачивает часть дерева виджетов. Он принимает экземпляр
Modelи делает его доступным для себя и своих потомков. - ScopedModelDescendant: Виджет, который позволяет получить доступ к экземпляру
Modelиз ближайшегоScopedModelвыше по дереву и подписаться на его изменения.
Преимущества использования Scoped Model:
- Простота: Легко понять и использовать, особенно для небольших и средних приложений.
- Основано на стандартных механизмах Flutter: Использует InheritedWidget, что делает его производительным.
- Хорошо документирован: Доступна исчерпывающая документация и примеры.
Пример использования:
-
Создать модель:
import 'package:scoped_model/scoped_model.dart'; class CounterModel extends Model { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); // Уведомляем виджеты об изменении } } -
Обернуть часть дерева в
ScopedModel:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Импорт модели void main() { runApp( // Оборачиваем наше приложение в ScopedModel ScopedModel<CounterModel>( model: CounterModel(), child: MyApp(), ), ); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Scoped Model Example')), body: Center( child: CounterDisplay(), ), floatingActionButton: IncrementButton(), ), ); } } -
Получить доступ к модели в
ScopedModelDescendant:import 'package:flutter/material.dart'; import 'package:scoped_model/scoped_model.dart'; import 'counter_model.dart'; // Импорт модели class CounterDisplay extends StatelessWidget { @override Widget build(BuildContext context) { // Получаем доступ к модели и подписываемся на ее изменения 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) { // Получаем доступ к модели без подписки на изменения return FloatingActionButton( onPressed: () { ScopedModel.of<CounterModel>(context).increment(); }, child: Icon(Icons.add), ); } }
Scoped Model хорошо подходит для приложений, где управление состоянием не является слишком сложным и можно обойтись без более мощных, но и более многословных решений, таких как BLoC или Riverpod. Однако для крупных и сложных приложений с большим количеством взаимосвязанных состояний могут потребоваться более продвинутые подходы.