Sobes.tech
Junior

Mit használ a Scoped Model a Flutterben?

sobes.tech MI

Válasz az MI-től

A Scoped Model egy egyszerű könyvtár az állapotkezeléshez Flutterben, amely az InheritedWidget koncepciójára épül. Lehetővé teszi adatok (modell) hozzáférését és módosítását anélkül, hogy minden szinten kifejezetten át kellene adni az adatokat a konstruktorokon keresztül.

A Scoped Model fő összetevői:

  • Model: Olyan osztály, amely tárolja az adatokat és az üzleti logikát. A scoped_model csomag Model-jéből kell kiterjeszteni.
  • ScopedModel: Egy widget, amely egy részét a widget fájának körülveszi. Elfogad egy Model példányt, és elérhetővé teszi saját maga és leszármazottai számára.
  • ScopedModelDescendant: Egy widget, amely lehetővé teszi a Model példányhoz való hozzáférést a legközelebbi ScopedModel-től feljebb a fában, és feliratkozik a változásaira.

A Scoped Model használatának előnyei:

  • Egyszerűség: Könnyen érthető és használható, különösen kis- és közepes méretű alkalmazásokhoz.
  • A Flutter szabványos mechanizmusaira épül: Az InheritedWidget-et használja, ami hatékonyabbá teszi.
  • Kiváló dokumentáció: Részletes dokumentáció és példák állnak rendelkezésre.

Használati példa:

  1. Modell létrehozása:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Widget-ek értesítése a változásról
      }
    }
    
  2. Rész körülvétele ScopedModel-lel:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Modell importálása
    
    void main() {
      runApp(
        // Alkalmazás körülvétele ScopedModel-lel
        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. Hozzáférés a modellhez ScopedModelDescendant-tel:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Modell importálása
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Hozzáférés a modellhez és feliratkozás a változásokra
        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) {
        // Hozzáférés a modellhez változás nélkül
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

A Scoped Model alkalmas olyan alkalmazásokhoz, ahol az állapotkezelés nem túl bonyolult, és el lehet hagyni a bonyolultabb, de erősebb megoldásokat, mint például a BLoC vagy a Riverpod. Azonban nagyobb és összetettebb alkalmazások esetén, sok összefüggő állapottal, fejlettebb megközelítésekre lehet szükség.