Flutterステータス管理InheritedWidgetは、ValueListenableBuilderと組み合わせてsetStateの代わりに使用されます.
5677 ワード
文書ディレクトリ前言 ステップ ステップ1定義管理 ステップ2配置モニタ ステップ3バインドデータ ステップ4データ表示 ステップ5概要 コード 前言
InheritedWidgetクラスはValueListenableBuilderとValueNotifierを組み合わせてsetStateの代わりに、statelessのクラスを使用することができ、またデータが変化するとローカルデータがリフレッシュされ、効率的にリソースを節約することができる.
ステップ
ステップ1管理の定義
第1管理の監視クラスCounterInheritedNotifyを定義し、監視パッケージWidgetを配置する
第2定義管理のデータ類CounterNotify、データ分離、論理がより明確
ステップ2モニタの配置
ステップ3データのバインド
モニタリングを配置すると同時にバインドされたモニタリングデータクラスは、理解を容易にするために単独で強調される.
ステップ4データ表示
第1呼び出しCounterInheritedNotify.of(context)モニタに取得されたデータクラス
第2にValueListenableBuilderでsetStateの代わりに変化値を取得する
手順5の概要
クラスCounterInheritedNotifyモニタリングの管理クラスは、Scaffoldを包むために用いられるが、他のクラスCounterNotifyモニタリングのデータクラスも可能であり、データの格納を担当し、addなどのクラスValueNotifierモニタリングのデータクラスにおける格納データの変数は、このタイプのCounterInheritedNotifyである必要がある.ofこの方法で監視するデータクラスをクラスValueListenableBuilderがbuildを介して変化値を必要とするWidgetを生成するWidgetにアクセスできるようにし、監視するデータクラスの値をバインドするためのパラメータvalueListenableもある(タイプはValueNotifierクラスでなければならない).
コード#コード#
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;
}
}