跳转页面去另一个页面可以覆盖当前页面,回来的时候值还存在(后期你就明白了)

状态自上而下传递数据。

<比如说我们的 MediaQuery.of(context)也使用了>

可以共享数据,或者你监听数据变化然后改变缓存中的值。

应为我们改变状态需要在 StatefulWidget 才能改变状态,所以我们在继承 InheritedWidget 的时候在 StatefulWidget 中调用。

UserBean

  1. class UserBean {
  2. String name;
  3. String address;
  4. UserBean({this.address,this.name});
  5. String toString(){
  6. return "UserBean{name: $name, address : $address}";
  7. }
  8. }

UserInfoWidget

  1. import 'package:YuWeiFlutterApp/src/userbean.dart';
  2. import 'package:flutter/widgets.dart';
  3. class UserInfoInheritedWidget extends InheritedWidget {
  4. UserBean userBean;
  5. Function updateInfo;
  6. UserInfoInheritedWidget({
  7. this.userBean,
  8. Key key,
  9. Widget child,
  10. this.updateInfo,
  11. }):super(key: key, child: child);
  12. void updateUserBean(String username, String useraddress){
  13. updateInfo(username,useraddress);
  14. }
  15. @override
  16. bool updateShouldNotify(UserInfoInheritedWidget oldWidget) {
  17. return oldWidget.userBean != userBean;
  18. // if( oldWidget.userBean.name != userBean.name || oldWidget.userBean.address != userBean.address ){
  19. // return true; // 更新视图
  20. // }
  21. // return false; // 不更新视图
  22. }
  23. }
  24. class UserInfoWidget extends StatefulWidget {
  25. UserBean userBean;
  26. Widget child;
  27. UserInfoWidget({this.userBean, Key key , this.child}) : super(key: key);
  28. static UserInfoInheritedWidget of( BuildContext context ){
  29. return context.dependOnInheritedWidgetOfExactType<UserInfoInheritedWidget>();
  30. }
  31. @override
  32. _UserInfoWidgetState createState() => _UserInfoWidgetState();
  33. }
  34. class _UserInfoWidgetState extends State<UserInfoWidget> {
  35. void _updata(String name , String address){
  36. widget.userBean = UserBean(name: name , address: address);
  37. setState(() {
  38. });
  39. }
  40. @override
  41. Widget build(BuildContext context) {
  42. return UserInfoInheritedWidget(
  43. userBean: widget.userBean,
  44. child: widget.child,
  45. updateInfo : _updata
  46. );
  47. }
  48. }

IndexInHeritedWidget 页面 【使用值】

  1. import 'package:YuWeiFlutterApp/src/index_textPage.dart';
  2. import 'package:YuWeiFlutterApp/src/userInfo_widhet.dart';
  3. import 'package:flutter/material.dart';
  4. class IndexInHeritedWidget extends StatefulWidget {
  5. @override
  6. _IndexInHeritedWidgetState createState() => _IndexInHeritedWidgetState();
  7. }
  8. class _IndexInHeritedWidgetState extends State<IndexInHeritedWidget> {
  9. @override
  10. Widget build(BuildContext context) {
  11. print("page1");
  12. return Scaffold(
  13. appBar: AppBar(
  14. title: Text("Page_1"),
  15. ),
  16. body: Container(
  17. width: double.infinity,
  18. height: double.infinity,
  19. color: Color(0x88f1f1f1),
  20. child: Column(
  21. children: [
  22. SizedBox(height: 10.0,),
  23. Text(UserInfoWidget.of(context).userBean.name), /// 使用
  24. SizedBox(height: 10.0,),
  25. Text(UserInfoWidget.of(context).userBean.address), /// 使用
  26. SizedBox(height: 500.0,),
  27. FloatingActionButton(
  28. onPressed: (){
  29. Navigator.of(context).push(MaterialPageRoute(
  30. builder: (context) => IndexTextPage()
  31. ));
  32. },
  33. child: Icon(Icons.chevron_right),
  34. )
  35. ],
  36. ),
  37. ),
  38. );
  39. }
  40. }

IndexTextPage 页面 【使用值 和 改变值】

  1. import 'package:YuWeiFlutterApp/src/index_inheritedwidget.dart';
  2. import 'package:YuWeiFlutterApp/src/userInfo_widhet.dart';
  3. import 'package:YuWeiFlutterApp/src/userbean.dart';
  4. import 'package:YuWeiFlutterApp/src/util/navigator_util.dart';
  5. import 'package:flutter/material.dart';
  6. class IndexTextPage extends StatefulWidget {
  7. @override
  8. _IndexTextPageState createState() => _IndexTextPageState();
  9. }
  10. class _IndexTextPageState extends State<IndexTextPage> {
  11. @override
  12. Widget build(BuildContext context) {
  13. print("page2");
  14. return Scaffold(
  15. appBar: AppBar(
  16. title: Text("Page_2"),
  17. ),
  18. body: Container(
  19. width: double.infinity,
  20. height: double.infinity,
  21. color: Color(0x88f1f1f1),
  22. child: Column(
  23. children: [
  24. SizedBox(height: 200.0,),
  25. Text(UserInfoWidget.of(context).userBean.name),
  26. SizedBox(height: 10.0,),
  27. Text(UserInfoWidget.of(context).userBean.address),
  28. SizedBox(height: 290.0,),
  29. FloatingActionButton(
  30. onPressed: (){
  31. UserInfoWidget.of(context).updateUserBean("Flutter change", "Child change"); // 改变。
  32. },
  33. child: Icon(Icons.error),
  34. ),
  35. SizedBox(height: 20.0,),
  36. ],
  37. ),
  38. ),
  39. );
  40. }
  41. }

在根部使用

  1. Widget build(BuildContext context) {
  2. return UserInfoWidget(
  3. userBean: UserBean(
  4. name: "Flutter inheritedWidget" ,
  5. address: "China"
  6. ),
  7. child: MaterialApp(
  8. home: IndexInHeritedWidget(),
  9. ),
  10. );
  11. }