flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候)
如果我們有這樣一個(gè)應(yīng)用場景:
WidgetA執(zhí)行點(diǎn)擊之后將數(shù)據(jù)通過widgetB傳遞到其下的widgetC。
通??梢酝ㄟ^設(shè)置構(gòu)造函數(shù),傳遞對應(yīng)參數(shù)到制定的widget樹中,如下面代碼所描述:
表示需要將widgetA中的點(diǎn)擊改變內(nèi)容傳遞到widgetB中的widgetC中展示;
需要通過設(shè)置widgetB的構(gòu)造函數(shù),接收對應(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í)候代碼閱讀性降低,可以通過以下方法傳遞值到指定的widget中;
通過類似于Android中的contentProvider提供一個(gè)中間類,將需要傳遞的數(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í)行更新對應(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"),
),
);
}
}
通過以上方法即可在不同widget中傳遞需要改變的值。
總結(jié)
以上所述是小編給大家介紹的flutter傳遞值到任意widget(當(dāng)需要widget嵌套使用需要傳遞值的時(shí)候),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Android實(shí)現(xiàn)退出界面彈出提示對話框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)退出界面彈出提示對話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
一文詳解Jetpack?Android新一代導(dǎo)航管理Navigation
這篇文章主要為大家介紹了Jetpack?Android新一代導(dǎo)航管理Navigation詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
解析ADT-20問題 android support library
本篇文章是對ADT-20問題 android support library進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android中關(guān)于百度糯米app關(guān)閉網(wǎng)頁或窗口的方法(99%人不知)
這篇文章主要介紹了Android中關(guān)于百度糯米app中關(guān)閉網(wǎng)頁或窗口的方法,其實(shí)解決方法到很簡單,但是很多人都不知道如何解決的,在網(wǎng)上也很難找到答案的,下面小編給大家揭曉答案,需要的朋友可以參考下2016-08-08
Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法
這篇文章主要介紹了Android實(shí)現(xiàn)讀取SD卡下所有TXT文件名并用listView顯示出來的方法,涉及Android針對SD卡的讀取及文件遍歷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Android studio實(shí)現(xiàn)畫板功能
這篇文章主要介紹了Android studio實(shí)現(xiàn)畫板功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Android 開機(jī)應(yīng)用掃描相關(guān)總結(jié)
本篇文章只是作為指南引導(dǎo)去看PkMS,不會貼大段代碼進(jìn)行分析,更多是基于方法分析實(shí)現(xiàn)的邏輯,另外就是代碼是基于Android 11,與Android 10之前代碼有比較大的差別。2021-05-05
Android 采用AOP方式封裝6.0權(quán)限管理的方法
這篇文章主要介紹了Android 采用AOP方式封裝6.0權(quán)限管理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04

