Sobes.tech
Junior

Milleks kasutatakse Scoped Modeli Flutteris?

sobes.tech AI

Vastus AI-lt

Scoped Model on lihtne raamatukogu Flutteri oleku haldamiseks, mis põhineb InheritedWidget kontseptsioonil. Selle eesmärk on pakkuda juurdepääsu andmetele (mudelile) ning võimalust neid muuta vidinates puu allosas ilma, et peaks iga taseme puhul andmeid selgelt konstruktorite kaudu edasi andma.

Scoped Modeli põhikomponendid:

  • Model: Klass, mis hoiab andmeid ja äriloogikat. Selle peab laiendama Model-ist scoped_model paketist.
  • ScopedModel: Vidin, mis ümbritseb osa vidinate puust. See võtab vastu Model eksemplari ning teeb selle kättesaadavaks endale ja oma järeltulijatele.
  • ScopedModelDescendant: Vidin, mis võimaldab saada juurdepääsu Model eksemplarile lähima ScopedModel-i kaudu puu kõrgemal ning tellida selle muudatusi.

Scoped Modeli eelised:

  • Lihtne kasutada: kergesti mõistetav ja kasutatav, eriti väikestes ja keskmise suurusega rakendustes.
  • Põhineb Flutteri standardmehhanismidel: kasutab InheritedWidget-i, mis muudab selle tõhusaks.
  • Hea dokumentatsioon: saadaval põhjalik dokumentatsioon ja näited.

Kasutusnäide:

  1. Luua mudel:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // teavitame vidinaid muudatusest
      }
    }
    
  2. Ümber puu osa ScopedModel-iga:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // mudeli import
    
    void main() {
      runApp(
        // ümber meie rakenduse `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 näide')),
            body: Center(
              child: CounterDisplay(),
            ),
            floatingActionButton: IncrementButton(),
          ),
        );
      }
    }
    
  3. Saada juurdepääs mudelile ScopedModelDescendant-iga:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // mudeli import
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // juurdepääs mudelile ja selle muudatuste jälgimine
        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) {
        // juurdepääs mudelile ilma jälgimiseta
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model sobib hästi rakendustele, kus oleku haldamine ei ole liiga keeruline ning saab kasutada lihtsamaid lahendusi, nagu BLoC või Riverpod. Kuid suurte ja keerukate rakenduste puhul, kus on palju omavahel seotud oleku osi, võib olla vaja kasutada arenenumaid lähenemisviise.