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