Sobes.tech
Junior

Zašto se koristi Scoped Model u Flutteru?

sobes.tech АИ

Одговор од АИ

Scoped Model je jednostavna biblioteka za upravljanje stanjima u Flutter-u, zasnovana na konceptu InheritedWidget. Omogućava pristup podacima (modelu) i njihovu izmenu widget-ima u podstablu bez potrebe za eksplicitnim prenošenjem podataka kroz konstruktore na svakoj razini.

Glavne komponente Scoped Model-a:

  • Model: Klasa koja čuva podatke i poslovnu logiku. Treba da proširuje Model iz paketa scoped_model.
  • ScopedModel: Widget koji obuhvata deo stabla widget-a. Prima instancu Model i čini je dostupnom sebi i svojim potomcima.
  • ScopedModelDescendant: Widget koji omogućava pristup instanci Model iz najbližeg ScopedModel iznad u stablu i pretplatu na njegove promene.

Prednosti korišćenja Scoped Model:

  • Jednostavnost: Lako za razumevanje i korišćenje, posebno za manje i srednje aplikacije.
  • Zasnovano na standardnim mehanizmima Flutter-a: Koristi InheritedWidget, što ga čini efikasnijim.
  • Dobro dokumentovano: Dostupna je iscrpna dokumentacija i primeri.

Primer korišćenja:

  1. Kreiranje modela:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Obaveštava widget-e o promeni
      }
    }
    
  2. Obuhvatiti deo stabla ScopedModel-om:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Uvoz modela
    
    void main() {
      runApp(
        // Obuhvatiti našu aplikaciju 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 Primer')),
            body: Center(
              child: CounterDisplay(),
            ),
            floatingActionButton: IncrementButton(),
          ),
        );
      }
    }
    
  3. Pristup modelu putem ScopedModelDescendant:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Uvoz modela
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Dobijanje pristupa modelu i pretplata na njegove promene
        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) {
        // Dobijanje pristupa modelu bez pretplate na promene
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model je pogodan za aplikacije gde upravljanje stanjem nije previše složeno i može se izbeći korišćenje moćnijih, ali i složenijih rešenja poput BLoC ili Riverpod. Međutim, za veće i složenije aplikacije sa velikim brojem međusobno povezanih stanja, mogu biti potrebni napredniji pristupi.