跳转页面去另一个页面可以覆盖当前页面,回来的时候值还存在(后期你就明白了)
状态自上而下传递数据。
<比如说我们的 MediaQuery.of(context)也使用了>
可以共享数据,或者你监听数据变化然后改变缓存中的值。
应为我们改变状态需要在 StatefulWidget 才能改变状态,所以我们在继承 InheritedWidget 的时候在 StatefulWidget 中调用。
UserBean
class UserBean {
String name;
String address;
UserBean({this.address,this.name});
String toString(){
return "UserBean{name: $name, address : $address}";
}
}
UserInfoWidget
import 'package:YuWeiFlutterApp/src/userbean.dart';
import 'package:flutter/widgets.dart';
class UserInfoInheritedWidget extends InheritedWidget {
UserBean userBean;
Function updateInfo;
UserInfoInheritedWidget({
this.userBean,
Key key,
Widget child,
this.updateInfo,
}):super(key: key, child: child);
void updateUserBean(String username, String useraddress){
updateInfo(username,useraddress);
}
@override
bool updateShouldNotify(UserInfoInheritedWidget oldWidget) {
return oldWidget.userBean != userBean;
// if( oldWidget.userBean.name != userBean.name || oldWidget.userBean.address != userBean.address ){
// return true; // 更新视图
// }
// return false; // 不更新视图
}
}
class UserInfoWidget extends StatefulWidget {
UserBean userBean;
Widget child;
UserInfoWidget({this.userBean, Key key , this.child}) : super(key: key);
static UserInfoInheritedWidget of( BuildContext context ){
return context.dependOnInheritedWidgetOfExactType<UserInfoInheritedWidget>();
}
@override
_UserInfoWidgetState createState() => _UserInfoWidgetState();
}
class _UserInfoWidgetState extends State<UserInfoWidget> {
void _updata(String name , String address){
widget.userBean = UserBean(name: name , address: address);
setState(() {
});
}
@override
Widget build(BuildContext context) {
return UserInfoInheritedWidget(
userBean: widget.userBean,
child: widget.child,
updateInfo : _updata
);
}
}
IndexInHeritedWidget 页面 【使用值】
import 'package:YuWeiFlutterApp/src/index_textPage.dart';
import 'package:YuWeiFlutterApp/src/userInfo_widhet.dart';
import 'package:flutter/material.dart';
class IndexInHeritedWidget extends StatefulWidget {
@override
_IndexInHeritedWidgetState createState() => _IndexInHeritedWidgetState();
}
class _IndexInHeritedWidgetState extends State<IndexInHeritedWidget> {
@override
Widget build(BuildContext context) {
print("page1");
return Scaffold(
appBar: AppBar(
title: Text("Page_1"),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: Color(0x88f1f1f1),
child: Column(
children: [
SizedBox(height: 10.0,),
Text(UserInfoWidget.of(context).userBean.name), /// 使用
SizedBox(height: 10.0,),
Text(UserInfoWidget.of(context).userBean.address), /// 使用
SizedBox(height: 500.0,),
FloatingActionButton(
onPressed: (){
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => IndexTextPage()
));
},
child: Icon(Icons.chevron_right),
)
],
),
),
);
}
}
IndexTextPage 页面 【使用值 和 改变值】
import 'package:YuWeiFlutterApp/src/index_inheritedwidget.dart';
import 'package:YuWeiFlutterApp/src/userInfo_widhet.dart';
import 'package:YuWeiFlutterApp/src/userbean.dart';
import 'package:YuWeiFlutterApp/src/util/navigator_util.dart';
import 'package:flutter/material.dart';
class IndexTextPage extends StatefulWidget {
@override
_IndexTextPageState createState() => _IndexTextPageState();
}
class _IndexTextPageState extends State<IndexTextPage> {
@override
Widget build(BuildContext context) {
print("page2");
return Scaffold(
appBar: AppBar(
title: Text("Page_2"),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: Color(0x88f1f1f1),
child: Column(
children: [
SizedBox(height: 200.0,),
Text(UserInfoWidget.of(context).userBean.name),
SizedBox(height: 10.0,),
Text(UserInfoWidget.of(context).userBean.address),
SizedBox(height: 290.0,),
FloatingActionButton(
onPressed: (){
UserInfoWidget.of(context).updateUserBean("Flutter change", "Child change"); // 改变。
},
child: Icon(Icons.error),
),
SizedBox(height: 20.0,),
],
),
),
);
}
}
在根部使用
Widget build(BuildContext context) {
return UserInfoWidget(
userBean: UserBean(
name: "Flutter inheritedWidget" ,
address: "China"
),
child: MaterialApp(
home: IndexInHeritedWidget(),
),
);
}