flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)
作者:zhakesipailuo 发布时间:2022-05-17 22:53:44
标签:flutter,传递值,widget
如果我们有这样一个应用场景:
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
0
投稿
猜你喜欢
- 前言本篇文章主要介绍关于我在SpringBoot中使用MyBatis-Plus是如何解决Invalid bound statement (n
- 两个小解释:FileProvider是ContentProvider特殊的子类,ContentProvider通过创建content://
- IDE工具之IDEA2022.2的简介、下载与安装、初步配置IDEA简介概述IDEA全称是IntelliJ,是JetBrains公司推出一个
- Intellij IDEA 配置Subversion插件实现步骤详解在使用Intellij的过程中,突然发现svn不起效了,在VCS–》Ch
- 在JVM虚拟机规范中,Java虚拟机运行时数据区域除了程序计数器(Program Counter Register)外都有可能出现OutOf
- 本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下1.关联 compile ‘com.github.m
- 背景SpringBoot bean 加载顺序如何查看,想看加载了哪些bean, 这些bean的加载顺序是什么?实际加载顺序不受控制,但会有一
- 1、研究背景 在当今信息社会发展中中,计算机科
- 上一篇说的CountDownLatch是一个计数器,类似线程的join方法,但是有一个缺陷,就是当计数器的值到达0之后,再调用CountDo
- 题外话:发现好久都没有上来写博文了,毕业设计加上公司暂时没有Android的项目做,只能去自学web上的知识,摸爬打滚到现在,花了一个多月时
- 本文实例为大家分享了C#实现简单的聊天窗体的具体代码,供大家参考,具体内容如下一、要使用(学习)到的知识点1、textBox控件(1)功能:
- 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下。在我刚开始工作接触的项目
- 本文实例讲述了C#实现将DataTable内容输出到Excel表格的方法。分享给大家供大家参考。具体如下:1.关于本文本文描述了一个函数(S
- BigDecimal类对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDe
- 一、安装本地Maven选择你需要的maven版本下载:官网下载传送门我使用的是3.6.1版本:maven-3.6.1-bin.zip&nbs
- 当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel
- 实现Struts登录1、jar包拷贝首先是建立java web项目,之后打开我们我们下载好strtus框架,Struts-1.2.9-bin
- 目录1.下面有关JSP内置对象的描述,说法错误的是?2.Java语言与其它语言相比,独有的特点是( )3.下面哪个选项正确创建socket连
- 本文涉及3个基本点:1、因为很多公司的内网都设有代理,浏览器通过ip与port上网,而java代码模拟http get方式同样需要外网代理;
- java就业前需要掌握的专业技能1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、