这篇文章主要介绍flutter如何传递值到任意widget,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
如果我们有这样一个应用场景:
WidgetA执行点击之后将数据通过widgetB传递到其下的widgetC。
通常可以通过设置构造函数,传递对应参数到制定的widget树中,如下面代码所描述:
表示需要将widgetA中的点击改变内容传递到widgetB中的widgetC中展示;
需要通过设置widgetB的构造函数,接收对应参数,再传递给widgetC展示;
class Inheritedwidget extends StatefulWidget { @override _InheritedWidgetState createState() => _InheritedWidgetState(); } class _InheritedWidgetState extends State<Inheritedwidget> { int count=0; @override void initState() { // TODO: implement initState super.initState(); } @override Widget build(BuildContext context) { print(count); return Scaffold( appBar: AppBar(title: Text("inherited widget"),),body: Container( child: Center( child: Column( children: <Widget>[ Text("class0"), class1(count), ], ), ), ), floatingActionButton: FloatingActionButton(onPressed: (){ return addCount(); },child: Text("add"),), ); } void addCount() { setState(() { count=1+count; }); } }
WidgetB:
class class1 extends StatelessWidget { int count; class1(this.count); @override Widget build(BuildContext context) { return Container( child: Column( children: <Widget>[ Text("class1"), class2(count), ], ), ); } }
widgetC:
class class2 extends StatelessWidget { int count; class2(this.count); @override Widget build(BuildContext context) { return Container( child: Center( child: Text("$count"), ), ); } }
以上方法当然可以实现需要的效果,但是当有多层的widget嵌套关系的时候代码阅读性降低,可以通过以下方法传递值到指定的widget中;
通过类似于Android中的contentProvider提供一个中间类,将需要传递的数据通过中间类传递到制定的widget中。
中间类:
//countProvider类 提供count属性和child属性 用于与原widget相关联, class CountProvider extends InheritedWidget{ final int count; final Widget child; //构造方法 CountProvider({this.count, this.child}):super(child:child); //提供方法获取到countprovider类对象 static CountProvider of(BuildContext context){ return context.inheritFromWidgetOfExactType(CountProvider); } @override bool updateShouldNotify(InheritedWidget oldWidget) { // TODO: implement updateShouldNotify return false; } }
通过counterprovider包裹需要展示的widget并传入需要改变的值;
class Inheritedwidget extends StatefulWidget { @override _InheritedWidgetState createState() => _InheritedWidgetState(); } class _InheritedWidgetState extends State<Inheritedwidget> { int count=0; @override Widget build(BuildContext context) { print(count); return CountProvider( count:count, child: Scaffold( backgroundColor: Colors.blue, appBar: AppBar(title: Text("inherited widget"),),body: Container( child: Center( child: Column( children: <Widget>[ Text("class0"), class1(), ], ), ), ), floatingActionButton: FloatingActionButton(onPressed: (){ return addCount(); },child: Text("add"),), ), ); } void addCount() { setState(() { count=1+count; }); } }
使用中间类提供的数据执行更新对应widget。
class class2 extends StatelessWidget { @override Widget build(BuildContext context) { int count = CountProvider.of(context).count; return Container( child: Center( child: Text("$count"), ), ); } }
通过以上方法即可在不同widget中传递需要改变的值。
以上是“flutter如何传递值到任意widget”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。