Flutterステータス管理InheritedWidgetは、ValueListenableBuilderと組み合わせてsetStateの代わりに使用されます.

5677 ワード

文書ディレクトリ
  • 前言
  • ステップ
  • ステップ1定義管理
  • ステップ2配置モニタ
  • ステップ3バインドデータ
  • ステップ4データ表示
  • ステップ5概要
  • コード
  • 前言
    InheritedWidgetクラスはValueListenableBuilderとValueNotifierを組み合わせてsetStateの代わりに、statelessのクラスを使用することができ、またデータが変化するとローカルデータがリフレッシュされ、効率的にリソースを節約することができる.
    ステップ
    ステップ1管理の定義
    第1管理の監視クラスCounterInheritedNotifyを定義し、監視パッケージWidgetを配置する
    class CounterInheritedNotify extends InheritedWidget {
      CounterInheritedNotify({Key key, this.child, this.counterNotify})
          : super(key: key, child: child);
      final Widget child;
      final CounterNotify counterNotify;
      static CounterInheritedNotify of(BuildContext context) {
        return context.dependOnInheritedWidgetOfExactType();  }
      @override
      bool updateShouldNotify(CounterInheritedNotify oldWidget) {    return true;  }}
    

    第2定義管理のデータ類CounterNotify、データ分離、論理がより明確
    class CounterNotify with ChangeNotifier {
      ValueNotifier _countListenable = ValueNotifier(0);
      ValueNotifier get countListenable => _countListenable;
      void addValue(int i) { _countListenable.value += i;  }}
    

    ステップ2モニタの配置
    class InheritedNotify extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return CounterInheritedNotify(       //      CounterInheritedNotify
          counterNotify: CounterNotify(),      //        ,         
          child: Scaffold(                    //      Scaffold
            appBar: AppBar(
              title: Text("InheritedWidget  "), ),
            body:...}
    

    ステップ3データのバインド
    モニタリングを配置すると同時にバインドされたモニタリングデータクラスは、理解を容易にするために単独で強調される.
    counterNotify: CounterNotify(),  //        
    

    ステップ4データ表示
    第1呼び出しCounterInheritedNotify.of(context)モニタに取得されたデータクラス
    CounterNotify counterNotify =
                    CounterInheritedNotify.of(context).counterNotify;
    

    第2にValueListenableBuilderでsetStateの代わりに変化値を取得する
    ValueListenableBuilder(
                        valueListenable: counterNotify.countListenable,
                        builder:
                            (BuildContext context, dynamic value, Widget child) {
                          return Text('$value'); }, ),
    

    手順5の概要
    クラスCounterInheritedNotifyモニタリングの管理クラスは、Scaffoldを包むために用いられるが、他のクラスCounterNotifyモニタリングのデータクラスも可能であり、データの格納を担当し、addなどのクラスValueNotifierモニタリングのデータクラスにおける格納データの変数は、このタイプのCounterInheritedNotifyである必要がある.ofこの方法で監視するデータクラスをクラスValueListenableBuilderがbuildを介して変化値を必要とするWidgetを生成するWidgetにアクセスできるようにし、監視するデータクラスの値をバインドするためのパラメータvalueListenableもある(タイプはValueNotifierクラスでなければならない).
    コード#コード#
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() {
      runApp(MyApp());
      SystemUiOverlayStyle systemUiOverlayStyle =
          SystemUiOverlayStyle(statusBarColor: Colors.transparent);
      SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
    }
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: InheritedNotify (),
        );
      }
    }
    class InheritedNotify extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        print('scaffold    ');
        return CounterInheritedNotify(
          counterNotify: CounterNotify(),
          child: Scaffold(
            appBar: AppBar(
              title: Text("InheritedWidget  "),
            ),
            body: Builder(
              builder: (BuildContext context) {
                CounterNotify counterNotify =
                    CounterInheritedNotify.of(context).counterNotify;  //  
                return Container(
                  width: double.infinity,
                  margin: EdgeInsets.all(10),
                  child: Column(
                    children: [
                      Text("InheritedWidget  ValueNotify ValueListenableBuilder"),
                      SizedBox(
                        height: 10,
                      ),
                      ValueListenableBuilder(
                        valueListenable: counterNotify.countListenable,
                        builder:
                            (BuildContext context, dynamic value, Widget child) {
                              print('ValueListenableBuilder    ');
                          return Text('$value');
                        },
                      ),
                      SizedBox(
                        height: 10,
                      ),                
                      RaisedButton(
                        child: Text('  1'),
                        onPressed: () {
                          counterNotify.addValue(3);
                        },
                      ),
                    ],
                  ),
                );
              },
            ),
          ),
        );
      }
    }
    
    class CounterInheritedNotify extends InheritedWidget {
      CounterInheritedNotify({Key key, this.child, this.counterNotify})
          : super(key: key, child: child);
    
      final Widget child;
    
      final CounterNotify counterNotify;
    
      static CounterInheritedNotify of(BuildContext context) {
        return context.dependOnInheritedWidgetOfExactType();
      }
    
      @override
      bool updateShouldNotify(CounterInheritedNotify oldWidget) {
        return true;
      }
    }
    
    class CounterNotify with ChangeNotifier {
      ValueNotifier _countListenable = ValueNotifier(0);
      ValueNotifier get countListenable => _countListenable;
    
      void addValue(int i) {
        _countListenable.value += i;
      }
    }