zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Flutter InheritedWidget示例

flutter 示例
2023-09-27 14:27:34 时间
class InheritedWidgetComponent extends StatefulWidget {
  const InheritedWidgetComponent({Key? key, required this.title})
      : super(key: key);

  final String title;

  @override
  State<InheritedWidgetComponent> createState() {
    return InheritedWidgetState();
  }
}

class InheritedWidgetState extends State<InheritedWidgetComponent> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
        child: InheritedWidgetSidget(
          data: count,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(bottom: 20),
                child: Builder(builder: (context) {
                  return Text(
                      InheritedWidgetSidget.of(context)!.data.toString(),
                      style: const TextStyle(fontSize: 30));
                }),
              ),

              //用法二
              Padding(
                padding: const EdgeInsets.only(bottom: 20),
                child: _TestWidget(),
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () => setState(() => ++count),
          child: const Icon(Icons.add)),
    );
  }
}

class _TestWidget extends StatefulWidget {
  @override
  State<_TestWidget> createState() {
    return _TestWidgetState();
  }
}

class _TestWidgetState extends State<_TestWidget> {
  @override
  Widget build(BuildContext context) {
    return Text(InheritedWidgetSidget.of(context)!.data.toString(),
        style: const TextStyle(fontSize: 40));
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("didChangeDependencies");
  }
}

class InheritedWidgetSidget extends InheritedWidget {
  InheritedWidgetSidget({required this.data, required Widget child})
      : super(child: child);

  final int data; //需要在子树中共享的数据,保存点击次数

  //定义方法,方便子树中的widget获取共享数据
  static InheritedWidgetSidget? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<InheritedWidgetSidget>();
  }

  //该回调当data发生变化时,是否通知子树中依赖data的Widget
  @override
  bool updateShouldNotify(InheritedWidgetSidget oldWidget) {
    //如果返回true,则子树中依赖(build函数中有调用)本widget
    //的子widget的`state.didChangeDependencies`会被调用
    return oldWidget.data != data;
  }
}

在这里插入图片描述