flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)

作者:zhakesipailuo 时间:2022-05-17 22:53:44 

如果我们有这样一个应用场景:

WidgetA执行点击之后将数据通过widgetB传递到其下的widgetC。

通常可以通过设置构造函数,传递对应参数到制定的widget树中,如下面代码所描述:

表示需要将widgetA中的点击改变内容传递到widgetB中的widgetC中展示;

需要通过设置widgetB的构造函数,接收对应参数,再传递给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"),
  ),
 );
}
}

以上方法当然可以实现需要的效果,但是当有多层的widget嵌套关系的时候代码阅读性降低,可以通过以下方法传递值到指定的widget中;

通过类似于Android中的contentProvider提供一个中间类,将需要传递的数据通过中间类传递到制定的widget中。

中间类:


//countProvider类 提供count属性和child属性 用于与原widget相关联,
class CountProvider extends InheritedWidget{
final int count;
final Widget child;
//构造方法
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;
 });
}
}

使用中间类提供的数据执行更新对应widget。


class class2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
 int count = CountProvider.of(context).count;
 return Container(
  child: Center(
   child: Text("$count"),
  ),
 );
}
}

通过以上方法即可在不同widget中传递需要改变的值。

总结

以上所述是小编给大家介绍的flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候),网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/zhakesipailuo/article/details/96482054

标签:flutter,传递值,widget
0
投稿

猜你喜欢

  • 举例说明自定义C++异常处理的实例

    2022-10-25 13:45:27
  • SpringBoot用@Async注解实现异步任务

    2023-08-07 06:36:09
  • Springboot 使用maven release插件执行版本管理及打包操作

    2023-07-12 01:20:35
  • android中开启actionbar的两种方法

    2021-07-14 01:47:17
  • mybatis 对于生成的sql语句 自动加上单引号的情况详解

    2023-09-21 15:25:00
  • Windows7下的Java运行环境搭建过程图解

    2022-03-14 19:40:59
  • java获取json中的全部键值对实例

    2023-08-23 19:53:03
  • 一文探索Java文件读写更高效方式

    2021-12-20 08:31:22
  • Android Studio安装配置方法图文详细教程

    2023-01-08 23:10:16
  • 详解Android OkHttp完全解析

    2023-04-05 05:05:31
  • java使用Socket实现SMTP协议发送邮件

    2022-06-08 19:25:50
  • C#对XmlHelper帮助类操作Xml文档的通用方法汇总

    2023-06-29 05:37:01
  • java Stream流常见操作方法(反射,类加载器,类加载,反射)

    2022-03-24 06:54:56
  • JAVA IDEA入门使用手册(新手小白必备)

    2022-10-21 16:31:25
  • Android实现上下菜单双向滑动

    2023-06-10 02:43:37
  • springboot aspect通过@annotation进行拦截的实例代码详解

    2023-10-15 20:12:54
  • C#基于Socket实现简单聊天室功能

    2023-05-09 01:17:32
  • Android App中使用ViewPager+Fragment实现滑动切换效果

    2023-01-12 19:51:50
  • Android AIDL实现跨进程通信的示例代码

    2023-10-07 07:35:10
  • c# 判断是否为空然后赋值的4种实现方法

    2021-06-06 22:01:12
  • asp之家 软件编程 m.aspxhome.com