Sobes.tech
Junior

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ć Model z pakietu scoped_model.
  • ScopedModel: Widget otaczający część drzewa widgetów. Przyjmuje instancję Model i czyni ją dostępną dla siebie i swoich potomków.
  • ScopedModelDescendant: Widget umożliwiający dostęp do instancji Model z najbliższego ScopedModel powyż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:

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