flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候)
如果我們有這樣一個(gè)應(yīng)用場(chǎng)景:
WidgetA執(zhí)行點(diǎn)擊之后將數(shù)據(jù)通過(guò)widgetB傳遞到其下的widgetC。
通??梢酝ㄟ^(guò)設(shè)置構(gòu)造函數(shù),傳遞對(duì)應(yīng)參數(shù)到制定的widget樹(shù)中,如下面代碼所描述:
表示需要將widgetA中的點(diǎn)擊改變內(nèi)容傳遞到widgetB中的widgetC中展示;
需要通過(guò)設(shè)置widgetB的構(gòu)造函數(shù),接收對(duì)應(yīng)參數(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"),
),
);
}
}
以上方法當(dāng)然可以實(shí)現(xiàn)需要的效果,但是當(dāng)有多層的widget嵌套關(guān)系的時(shí)候代碼閱讀性降低,可以通過(guò)以下方法傳遞值到指定的widget中;
通過(guò)類(lèi)似于A(yíng)ndroid中的contentProvider提供一個(gè)中間類(lèi),將需要傳遞的數(shù)據(jù)通過(guò)中間類(lèi)傳遞到制定的widget中。
中間類(lèi):
//countProvider類(lèi) 提供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類(lèi)對(duì)象
static CountProvider of(BuildContext context){
return context.inheritFromWidgetOfExactType(CountProvider);
}
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
// TODO: implement updateShouldNotify
return false;
}
}
通過(guò)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;
});
}
}
使用中間類(lèi)提供的數(shù)據(jù)執(zhí)行更新對(duì)應(yīng)widget。
class class2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
int count = CountProvider.of(context).count;
return Container(
child: Center(
child: Text("$count"),
),
);
}
}
通過(guò)以上方法即可在不同widget中傳遞需要改變的值。
總結(jié)
以上所述是小編給大家介紹的flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Android跳轉(zhuǎn)到通訊錄獲取用戶(hù)名稱(chēng)和手機(jī)號(hào)碼的實(shí)現(xiàn)思路
這篇文章主要介紹了Android跳轉(zhuǎn)到通訊錄獲取用戶(hù)名稱(chēng)和手機(jī)號(hào)碼的實(shí)現(xiàn)思路,當(dāng)用戶(hù)點(diǎn)擊跳轉(zhuǎn)到通訊錄界面 并取通訊錄姓名和手機(jī)號(hào)碼 ,實(shí)現(xiàn)代碼簡(jiǎn)單易懂,非常不錯(cuò)感興趣的朋友一起看看吧2016-10-10
Android Studio實(shí)現(xiàn)幀動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)幀動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
詳談OnTouchListener與OnGestureListener的區(qū)別
下面小編就為大家?guī)?lái)一篇詳談OnTouchListener與OnGestureListener的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android中使用PagerSlidingTabStrip實(shí)現(xiàn)導(dǎo)航標(biāo)題的示例
本篇文章主要介紹了Android中使用PagerSlidingTabStrip實(shí)現(xiàn)導(dǎo)航標(biāo)題的示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Android簡(jiǎn)單實(shí)現(xiàn)自定義流式布局的方法
這篇文章主要介紹了Android簡(jiǎn)單實(shí)現(xiàn)自定義流式布局的方法,結(jié)合實(shí)例形式分析了Android流式布局的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-07-07
android開(kāi)發(fā)基礎(chǔ)教程—文件存儲(chǔ)功能實(shí)現(xiàn)
文件存儲(chǔ)功能在實(shí)現(xiàn)數(shù)據(jù)讀寫(xiě)時(shí)會(huì)頻繁使用到,接下來(lái)介紹文件存儲(chǔ)功能的實(shí)現(xiàn),感興趣的朋友可以了解下2013-01-01
說(shuō)說(shuō)在A(yíng)ndroid如何使用服務(wù)(Service)的方法
這篇文章主要介紹了說(shuō)說(shuō)在A(yíng)ndroid如何使用服務(wù)(Service)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Android Coil對(duì)比Glide深入分析探究
這篇文章主要介紹了Android Coil對(duì)比Glide,Coil是Android上的一個(gè)全新的圖片加載框架,它的全名叫做coroutine image loader,即協(xié)程圖片加載庫(kù)2023-02-02

