## 推薦閱讀
[《Flutter實戰》7.2 數據共享(InheritedWidget)](https://book.flutterchina.club/chapter7/inherited_widget.html)
[Flutter知識點: InheritedWidget](https://www.jianshu.com/p/387e2454d590)
[Flutter狀態管理(1)——InheritedWidget](https://cloud.tencent.com/developer/article/1506834)
## 狀態管理
Flutter的狀態管理分為兩種:局部狀態和全局狀態。
* 局部狀態:就是一個StatefulWidget可以搞定的;其他Widget不需要知道你的狀態,你也不需要依賴其他Widget的狀態
* 全局狀態:整個app很多頁面都需要用到的狀態,比如是否登錄了,用戶名、用戶id等;
Flutter狀態管理系列主要指的是全局狀態的管理,主要介紹的幾種實現方式有:
* InheritedWidget
* StreamBuilder
* Provider
簡單來說,InheritedWidget下面的Widget都可以獲取到該Widget持有的狀態。
Theme這個源碼大家可以去看一下 ,對理解 InheritedWidget會有比較大的幫助
## Demo
~~~
import 'package:flutter/material.dart';
class InheritedOneData{
int number = 1;
@override
bool operator ==(other) {
return number == (other as InheritedOneData).number;
}
}
class InheritedWidgetOne extends InheritedWidget {
final InheritedOneData data;
InheritedWidgetOne({@required this.data, Widget child}) : super(child: child);
static InheritedWidgetOne of(BuildContext context) {
return context.inheritFromWidgetOfExactType(InheritedWidgetOne);
}
@override
bool updateShouldNotify(InheritedWidgetOne oldWidget) {
return oldWidget.data != data;
}
}
class InheritedWidgetDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
Scaffold scaffold = Scaffold(
appBar: AppBar(
title: new Text("ScrollDemoPage"),
),
body: new Container(
child: new ContentView(),
),
);
return new InheritedWidgetOne(
data: new InheritedOneData(),
child: scaffold,
);
}
}
class ContentView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Column(
children: <Widget>[
new ShowView(),
new AddView(),
],
);
}
}
class ShowView extends StatelessWidget {
@override
Widget build(BuildContext context) {
InheritedOneData data = InheritedWidgetOne.of(context).data;
return new Text("${data.number}");
}
}
class AddView extends StatefulWidget {
@override
State<AddView> createState() {
return new AddViewViewState();
}
}
class AddViewViewState extends State<AddView> {
@override
Widget build(BuildContext context) {
return new RaisedButton(onPressed: () {
setState(() {
InheritedOneData data = InheritedWidgetOne.of(context).data;
data.number ++ ;
});
}, child: Text("add"));
}
}
~~~
其實核心方法就兩個
* inheritFromWidgetOfExactType:通過子widget可以通過BuildContext.inheritFromWidgetOfExactType(InheritedWidget)獲得到InheritedWidget的實例,從而隨時隨地獲取全局狀態的值
* updateShouldNotify