Назад к вопросам
Junior
118
questionbank

Для чего используется 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, что делает его производительным.
  • Хорошо документирован: Доступна исчерпывающая документация и примеры.

Пример использования:

  1. Создать модель:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Уведомляем виджеты об изменении
      }
    }
    
  2. Обернуть часть дерева в 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(),
          ),
        );
      }
    }
    
  3. Получить доступ к модели в 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. Однако для крупных и сложных приложений с большим количеством взаимосвязанных состояний могут потребоваться более продвинутые подходы.