flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)
如果我们有这样一个应用场景:
WidgetA执行点击之后将数据通过widgetB传递到其下的widgetC。
通常可以通过设置构造函数,传递对应参数到制定的widget树中,如下面代码所描述:
表示需要将widgetA中的点击改变内容传递到widgetB中的widgetC中展示;
需要通过设置widgetB的构造函数,接收对应参数,再传递给widgetC展示;
classInheritedwidgetextendsStatefulWidget{
@override
_InheritedWidgetStatecreateState()=>_InheritedWidgetState();
}
class_InheritedWidgetStateextendsState{
intcount=0;
@override
voidinitState(){
//TODO:implementinitState
super.initState();
}
@override
Widgetbuild(BuildContextcontext){
print(count);
returnScaffold(
appBar:AppBar(title:Text("inheritedwidget"),),body:Container(
child:Center(
child:Column(
children:[
Text("class0"),
class1(count),
],
),
),
),
floatingActionButton:FloatingActionButton(onPressed:(){
returnaddCount();
},child:Text("add"),),
);
}
voidaddCount(){
setState((){
count=1+count;
});
}
}
WidgetB:
classclass1extendsStatelessWidget{
intcount;
class1(this.count);
@override
Widgetbuild(BuildContextcontext){
returnContainer(
child:Column(
children:[
Text("class1"),
class2(count),
],
),
);
}
}
widgetC:
classclass2extendsStatelessWidget{
intcount;
class2(this.count);
@override
Widgetbuild(BuildContextcontext){
returnContainer(
child:Center(
child:Text("$count"),
),
);
}
}
以上方法当然可以实现需要的效果,但是当有多层的widget嵌套关系的时候代码阅读性降低,可以通过以下方法传递值到指定的widget中;
通过类似于Android中的contentProvider提供一个中间类,将需要传递的数据通过中间类传递到制定的widget中。
中间类:
//countProvider类提供count属性和child属性用于与原widget相关联,
classCountProviderextendsInheritedWidget{
finalintcount;
finalWidgetchild;
//构造方法
CountProvider({this.count,this.child}):super(child:child);
//提供方法获取到countprovider类对象
staticCountProviderof(BuildContextcontext){
returncontext.inheritFromWidgetOfExactType(CountProvider);
}
@override
boolupdateShouldNotify(InheritedWidgetoldWidget){
//TODO:implementupdateShouldNotify
returnfalse;
}
}
通过counterprovider包裹需要展示的widget并传入需要改变的值;
classInheritedwidgetextendsStatefulWidget{
@override
_InheritedWidgetStatecreateState()=>_InheritedWidgetState();
}
class_InheritedWidgetStateextendsState{
intcount=0;
@override
Widgetbuild(BuildContextcontext){
print(count);
returnCountProvider(
count:count,
child:Scaffold(
backgroundColor:Colors.blue,
appBar:AppBar(title:Text("inheritedwidget"),),body:Container(
child:Center(
child:Column(
children:[
Text("class0"),
class1(),
],
),
),
),
floatingActionButton:FloatingActionButton(onPressed:(){
returnaddCount();
},child:Text("add"),),
),
);
}
voidaddCount(){
setState((){
count=1+count;
});
}
}
使用中间类提供的数据执行更新对应widget。
classclass2extendsStatelessWidget{
@override
Widgetbuild(BuildContextcontext){
intcount=CountProvider.of(context).count;
returnContainer(
child:Center(
child:Text("$count"),
),
);
}
}
通过以上方法即可在不同widget中传递需要改变的值。
总结
以上所述是小编给大家介绍的flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!