Flutter

Flutter(三十一)InheritedWidget

2019-07-19  本文已影响2人  天色将变

InheritedWidget是一个无界面的功能widget,主要作用是widget树中数据共享。
流程:

image.png

示例:
自定义MyInheritedWidget 定义共享数据

class MyInheritedWidget extends InheritedWidget {
  final int data;
  MyInheritedWidget({
    @required this.data, //待共享的数据
    Widget child,
  }) : super(child: child);

  //获取当前MyInheritedWidget的实例
  static MyInheritedWidget of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(MyInheritedWidget);
  }

  @override
  bool updateShouldNotify(MyInheritedWidget oldWidget) {
    // 新旧数据不一致时,返回true,通知依赖本widget的子widget,此时子widget中的didChangeDependencies方法会被调用
    return oldWidget.data != data;
  }
}

依赖MyInheritedWidget中的数据

class DependWidget extends StatefulWidget {
  @override
  DependWidgetState createState() {
    return new DependWidgetState();
  }
}

class DependWidgetState extends State<DependWidget> {
  @override
  Widget build(BuildContext context) {
    // 使用依赖的InheritedWidget中的数据
    return Text(MyInheritedWidget.of(context).data.toString());
  }

  // 当依赖的InheritedWidget中的数据发生变化时,调用此方法
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print('change.....');
  }
}

当共享数据变化时,依赖发生变化。

class _MyHomePageState extends State<MyHomePage> {
  int count = 0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: MyInheritedWidget(
          data: count,// setState后  共享数据变化
          child: Center(
            child: DependWidget(),// 共享数据变化,影响该widget
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () {
              setState(() {
                ++count;// 数据变化
              },
            );
          },
        child: Icon(Icons.add),
      ),
    );
  }
}
上一篇 下一篇

猜你喜欢

热点阅读