Sobes.tech
Junior

Flutter'da Scoped Model ne işe yarar?

sobes.tech yapay zeka

AI'dan gelen yanıt

Scoped Model, Flutter'da durumu yönetmek için InheritedWidget kavramına dayanan basit bir kütüphanedir. Veri (model) erişimini sağlar ve her seviyedeki yapıcılar aracılığıyla verileri açıkça iletmeye gerek kalmadan alt widget'lara erişim ve değiştirme imkanı sunar.

Scoped Model'in temel bileşenleri:

  • Model: Veri ve iş mantığını tutan sınıf. scoped_model paketinden Model'i genişletmelidir.
  • ScopedModel: Widget ağacının bir bölümünü saran widget. Bir Model örneği alır ve kendisi ile çocuklarına erişilebilir kılar.
  • ScopedModelDescendant: En yakın ScopedModel'den Model örneğine erişim sağlar ve değişikliklere abone olur.

Scoped Model kullanmanın avantajları:

  • Basitlik: Anlaşılması ve kullanımı kolaydır, özellikle küçük ve orta ölçekli uygulamalar için.
  • Flutter'ın standart mekanizmalarına dayanır: InheritedWidget kullanır, bu da onu verimli kılar.
  • İyi belgelenmiş: Kapsamlı dokümantasyon ve örnekler mevcuttur.

Kullanım örneği:

  1. Model oluşturma:

    import 'package:scoped_model/scoped_model.dart';
    
    class CounterModel extends Model {
      int _counter = 0;
    
      int get counter => _counter;
    
      void increment() {
        _counter++;
        notifyListeners(); // Widget'lara değişiklikleri bildirir
      }
    }
    
  2. Model'in bir kısmını ScopedModel ile sarmalama:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Model'i içe aktar
    
    void main() {
      runApp(
        // Uygulamamızı ScopedModel ile sarmalıyoruz
        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 Örneği')),
            body: Center(
              child: CounterDisplay(),
            ),
            floatingActionButton: IncrementButton(),
          ),
        );
      }
    }
    
  3. ScopedModelDescendant içinde modele erişim:

    import 'package:flutter/material.dart';
    import 'package:scoped_model/scoped_model.dart';
    import 'counter_model.dart'; // Model'i içe aktar
    
    class CounterDisplay extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // Model'e erişir ve değişikliklere abone olur
        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) {
        // Model'e erişir ama değişikliklere abone olmaz
        return FloatingActionButton(
          onPressed: () {
            ScopedModel.of<CounterModel>(context).increment();
          },
          child: Icon(Icons.add),
        );
      }
    }
    

Scoped Model, durum yönetiminin çok karmaşık olmadığı ve BLoC veya Riverpod gibi daha güçlü ama daha uzun çözümlerden kaçınılabileceği uygulamalar için uygundur. Ancak, büyük ve karmaşık uygulamalarda, birçok ilişkili durumu yönetmek için daha gelişmiş yaklaşımlar gerekebilir.