热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter中的局部刷新ValueNotifier和ValueListenableBuilder

文章目录一、前言二、单个数据的刷新三、多个数据的监听四、自定义数据的监听五、参考链接一、前言在Flutter中通常刷新UI是使用setState((){});进行刷新࿰


文章目录

    • 一、前言
    • 二、单个数据的刷新
    • 三、多个数据的监听
    • 四、自定义数据的监听
    • 五、参考链接


一、前言

在Flutter中通常刷新UI是使用setState(() {});进行刷新,只是这种方式会让UI进行全局刷新,对于比较复杂的页面来说,如果仅仅是改变其中一小部分的UI来说进行刷新是不恰当的,因此官方提供了ValueNotifier来进行刷新。ValueNotifier是一个泛型,所以可以传递各种数据。ValueNotifier不仅仅可以进行单个组件的刷新,也可以同时被多个组件进行监听,还可以对自定义数据进行处理,本文通过一个点击按钮改变数字的功能进行演示。ValueNotifier其父类为ChangeNotifier,可以参考以下链接进行了解:
https://blog.csdn.net/Mr_Tony/article/details/112345491


二、单个数据的刷新

void main() => runApp(MyApp());ValueNotifier _valueNotifier = ValueNotifier(0);//数据监听器class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Material App',home: Scaffold(appBar: AppBar(title: Text('Material App Bar'),),body: Center(child: Container(child: Column(children: [ChildWidget1(),ChildWidget2()],),),),),);}
}class ChildWidget1 extends StatefulWidget {@override_ChildWidget1State createState() => _ChildWidget1State();
}class _ChildWidget1State extends State {@overrideWidget build(BuildContext context) {print('YM---ChildWidget1----进行刷新啊');return ValueListenableBuilder(valueListenable: _valueNotifier,builder: (BuildContext context, int value, Widget child){print('YM----ChildWidget1-----ValueListenableBuilder----进行刷新啊');return Text('ChildWidget1新值:$value');},// child: Container(// child: Text('子控件'),// ),);}
}class ChildWidget2 extends StatefulWidget {@override_ChildWidget2State createState() => _ChildWidget2State();
}class _ChildWidget2State extends State {@overrideWidget build(BuildContext context) {print('YM---ChildWidget2----进行刷新啊');return Container(child: RaisedButton(onPressed: (){_valueNotifier.value++;},child: Text('点击更改其它地方的数据'),),);}
}

三、多个数据的监听

class ChildWidget3 extends StatelessWidget {@overrideWidget build(BuildContext context) {return ValueListenableBuilder(valueListenable: _valueNotifier,builder: (BuildContext context, int value, Widget child){print('YM--ChildWidget3-----ValueListenableBuilder----进行刷新啊');return Text('ChildWidget3新值:$value');},// child: Container(// child: Text('子控件'),// ),);}
}...Column(children: [ChildWidget1(),ChildWidget2(),ChildWidget3()],)
...

四、自定义数据的监听

在实际业务中,通常会定义数据模型,对于单个实例也只是改变里面的数据,因此需要用到自定义ValueNotifier的方式,通过将上文的int值包装在一个实体类里面来对该功能进行演示

自定义的CounterValueNotifier如下:

class Counter{int count = 0;
}class CounterValueNotifier extends ValueNotifier{CounterValueNotifier(Counter counter):super(counter);changeCount(){value.count++;notifyListeners();}
}CounterValueNotifier _counterValueNotifier = CounterValueNotifier(Counter());

修改ValueListenableBuilder如下:

ValueListenableBuilder(valueListenable: _counterValueNotifier,builder: (BuildContext context, Counter value, Widget child){print('YM----ChildWidget1-----ValueListenableBuilder----进行刷新啊');return Text('ChildWidget1新值:${value.count}');},// child: Container(// child: Text('子控件'),// ),)

修改点击事件如下:

RaisedButton(onPressed: (){_counterValueNotifier.changeCount();},child: Text('点击更改其它地方的数据'),
)

五、参考链接


  1. Flutter 组件 | ValueListenableBuilder 局部刷新小能手:

    https://juejin.cn/post/6912206134078078990

  2. Flutter ValueNotifier 异步通信、ValueListenableBuilder异步更新数据:

    https://blog.csdn.net/zl18603543572/article/details/109151309


推荐阅读
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 在Android开发中,通过调用系统内置的音频和视频播放功能,可以实现高效、便捷的多媒体处理。本文将详细介绍如何利用Android系统的媒体播放器组件,实现对音频和视频文件的播放控制,包括基本的播放、暂停、停止等操作,以及如何处理播放过程中的各种事件,确保应用的稳定性和用户体验。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 使用PyQt5与OpenCV实现电脑摄像头的图像捕捉功能
    本文介绍了如何使用Python中的PyQt5和OpenCV库来实现电脑摄像头的图像捕捉功能。通过结合这两个强大的工具,用户可以轻松地打开摄像头并进行实时图像采集和处理。代码示例展示了如何初始化摄像头、捕获图像并将其显示在PyQt5的图形界面中。此外,还提供了详细的步骤说明和代码注释,帮助开发者快速上手并实现相关功能。 ... [详细]
  • 安装Qt时,Qt\Qt5.x.x文件夹下自动安装了example文件夹,其中包含了大量的示例。这里根据Examples\Qt-5.5\widgets\t ... [详细]
author-avatar
心诚新城
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有