flutter傳遞值到任意widget(當需要widget嵌套使用需要傳遞值的時候)
如果我們有這樣一個應用場景:
WidgetA執(zhí)行點擊之后將數(shù)據(jù)通過widgetB傳遞到其下的widgetC。
通??梢酝ㄟ^設(shè)置構(gòu)造函數(shù),傳遞對應參數(shù)到制定的widget樹中,如下面代碼所描述:
表示需要將widgetA中的點擊改變內(nèi)容傳遞到widgetB中的widgetC中展示;
需要通過設(shè)置widgetB的構(gòu)造函數(shù),接收對應參數(shù),再傳遞給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"),
),
);
}
}
以上方法當然可以實現(xiàn)需要的效果,但是當有多層的widget嵌套關(guān)系的時候代碼閱讀性降低,可以通過以下方法傳遞值到指定的widget中;
通過類似于Android中的contentProvider提供一個中間類,將需要傳遞的數(shù)據(jù)通過中間類傳遞到制定的widget中。
中間類:
//countProvider類 提供count屬性和child屬性 用于與原widget相關(guān)聯(lián),
class CountProvider extends InheritedWidget{
final int count;
final Widget child;
//構(gòu)造方法
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;
});
}
}
使用中間類提供的數(shù)據(jù)執(zhí)行更新對應widget。
class class2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
int count = CountProvider.of(context).count;
return Container(
child: Center(
child: Text("$count"),
),
);
}
}
通過以上方法即可在不同widget中傳遞需要改變的值。
總結(jié)
以上所述是小編給大家介紹的flutter傳遞值到任意widget(當需要widget嵌套使用需要傳遞值的時候),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Android跳轉(zhuǎn)到通訊錄獲取用戶名稱和手機號碼的實現(xiàn)思路
這篇文章主要介紹了Android跳轉(zhuǎn)到通訊錄獲取用戶名稱和手機號碼的實現(xiàn)思路,當用戶點擊跳轉(zhuǎn)到通訊錄界面 并取通訊錄姓名和手機號碼 ,實現(xiàn)代碼簡單易懂,非常不錯感興趣的朋友一起看看吧2016-10-10
詳談OnTouchListener與OnGestureListener的區(qū)別
下面小編就為大家?guī)硪黄斦凮nTouchListener與OnGestureListener的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android中使用PagerSlidingTabStrip實現(xiàn)導航標題的示例
本篇文章主要介紹了Android中使用PagerSlidingTabStrip實現(xiàn)導航標題的示例,具有一定的參考價值,有興趣的可以了解一下。2017-01-01
android開發(fā)基礎(chǔ)教程—文件存儲功能實現(xiàn)
文件存儲功能在實現(xiàn)數(shù)據(jù)讀寫時會頻繁使用到,接下來介紹文件存儲功能的實現(xiàn),感興趣的朋友可以了解下2013-01-01
說說在Android如何使用服務(wù)(Service)的方法
這篇文章主要介紹了說說在Android如何使用服務(wù)(Service)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06

