跳转页面去另一个页面可以覆盖当前页面,回来的时候值还存在(后期你就明白了)
状态自上而下传递数据。
<比如说我们的 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);}@overridebool 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(() {});}@overrideWidget 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> {@overrideWidget 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> {@overrideWidget 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(),),);}
