Sobes.tech
Junior

Na čo sa používa Scoped Model vo Flutteri?

sobes.tech AI

Odpoveď od AI

Scoped Model je jednoduchá knižnica na správu stavu vo Flutteri, založená na koncepte InheritedWidget. Umožňuje prístup k údajom (modelu) a ich zmenu widgetom v podstrome bez potreby ich explicitného odovzdávania cez konštruktory na každej úrovni.

Hlavné komponenty Scoped Model:

  • Model: Trieda, ktorá uchováva údaje a obchodnú logiku. Mala by rozširovať Model z balíka scoped_model.
  • ScopedModel: Widget, ktorý obklopuje časť stromu widgetov. Prijíma inštanciu Model a sprístupňuje ju sebe a svojim potomkom.
  • ScopedModelDescendant: Widget, ktorý umožňuje získať prístup k inštancii Model z najbližšieho ScopedModel vyššie v strome a prihlásiť sa na jeho zmeny.

Výhody používania Scoped Model:

  • Jednoduchosť: Jednoduché na pochopenie a použitie, najmä pre malé a stredné aplikácie.
  • Založené na štandardných mechanizmoch Flutteru: Používa InheritedWidget, čo ho robí efektívnejším.
  • Dobre zdokumentované: K dispozícii je komplexná dokumentácia a príklady.

Príklad použitia:

  1. Vytvorenie modelu:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Oznámenie widgetom o zmene
      }
    }
    
  2. Obaliť časť stromu ScopedModel-om:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Import modelu
    
    void main() {
      runApp(
        // Obaliť našu aplikáciu ScopedModel-om
        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. Získať prístup k modelu cez 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) {
        // Získať prístup k modelu a prihlásiť sa na jeho zmeny
        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) {
        // Získať prístup k modelu bez prihlásenia sa na zmeny
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model je vhodný pre aplikácie, kde správa stavu nie je príliš zložitá a dá sa obísť bez výkonnejších, ale aj zložitejších riešení, ako sú BLoC alebo Riverpod. Avšak pre väčšie a zložitejšie aplikácie s veľkým množstvom prepojených stavov môžu byť potrebné pokročilejšie prístupy.