首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

flutter源码:setState分析

setState方法算是flutter使用最频繁的方法了,每次页面数据有改变,都需要调用这个方法,去触发页面的刷新,展示最新的UI效果,接下来从源码角度解读下setState后具体发生了什么 系统源码部分...,会做截取,仅保留跟主题有关的部分,开始吧 void setState(VoidCallback fn) { // 省略了一大堆的判断代码 final Object?...scheduleBuildFor(this); } 就是把这个element标记为dirty,如果已经标记过,则忽略,说明连续调用两次setState方法,第二次其实是多余的,然后是调用owner...其实就是告诉系统,在下一帧刷新的时候,需要更新当前widget,整个过程,是一个异步的行为,所以下面的三个写法,效果上是一样的 // 写法一 _counter++; setState((...) {}); // 写法二 setState(() { _counter++; }); // 写法三 setState(() {}); _counter+

47310
您找到你想要的搜索结果了吗?
是的
没有找到

Flutter | 启动,渲染,setState 流程

SchedulerPhase.midFrameMicrotasks); Timeline.finishSync(); // end the "Animate" phase try { // 切换当前生命周期状态...下面我们以 setState 的更新流程为例先对整个更新流程有一个比较深的印象。 setState 执行流 void setState(VoidCallback fn) { assert(fn !...这也侧面说明如果你频繁的 setState 的时候,如果上次的渲染流程没有完成,则不会发起新的渲染。...到此,setState 中最核心的就是触发了一个 请求,在下一次屏幕刷新的时候就会回调 onBeginFrame,执行完成之后才会调用 onDrawFrame 方法。...上屏,会将绘制出的bit数据发送给GPU .....///// } } 复制代码 以上,便是 setState 调用的大概过程,实际的流程会更加复杂一点,例如在这个过程中不允许再次调用 setState

1.1K10

Flutter中的操作提示

在前面的文章中我们学习了Flutter中输入以及选择控件的用法,借助于这些组件大家可以完成很多常用的功能,但是他不能及时在用户操作后完成相应的界面提示,所以今天我们就会来看下Flutter中的操作提示。...class MyAppState extends State { var _isChecked = true; onCheckChange(bool isChecked) { setState...radioValue = value; }); } var isSwitch = true; onSwitchChange(bool isChecked) { setState...在原生客户端有着几种常用的用户提醒方式,如Dialog、Snackbar、BottomSheet等,今天我们就来介绍下Flutter中几种常用的提醒方式。...好吧,也很简单,我们接下来看下BottomSheet BottomSheet 也被称为底部菜单,通常情况下分享操作界面使用的比较多。

2.1K30

FluttersetState更新原理和流程

分析 Flutter状态类: StatelessWidget:无状态类,没有状态更新,界面一经创建无法更改; StatefulWidget:有状态类,当状态改变,调用setState()方法会触发StatefulWidget...也就是只有当我们的类是有状态类的时候才能进行状态刷新,setState也是在State(有状态类)类里 解析 :framework.dart文件State类 调用 setState() 必须是没有调用过...if (mounted) { setState(() {}); } setState方法 void setState(VoidCallback fn) { ......_element.markNeedsBuild(); } setState方法除了一些条件判断就是:_element.markNeedsBuild();那我们看看markNeedsBuild。...() { client_.ScheduleFrame(); // 看下面Engine::ScheduleFrame } Engine::ScheduleFrame 所在文件:flutter/shell

73020

Flutter主题切换 flutter redux

redux主要由Store、Action、Reducer三部分组成 Store用于存储和管理State集成flutter redux修改项目根目录下pubspec.yaml,并添加依赖flutter_redux...State数据 2.Widget通过Action触发一种新的行为 3.Reducer根据收到的Action更新State 4.更新Store中的State绑定的Widget 根据以上流程,我们实现项目中的主题切换功能...项目集成flutter redux库 创建State 创建一个State对象AppState,用于储存需要共享的主题数据,并且完成AppState初始化工作,如下面代码所示 class AppState...ThemeData themeData; RefreshThemeDataAction(this.themeData); } RefreshThemeDataAction的参数themeData是用来接收新切换的主题...> store) { return _ViewModel( themeData: store.state.themeData, ); } } 用户行为 最后,只需要添加切换主题部分的代码即可

84310

Flutter 入门指北之弹窗和提示(干货)

前面的小节把常用的一些部件都介绍了,这节介绍下 Flutter 中的一些操作提示。...Flutter 中的操作提示主要有这么几种 SnackBar、BottomSheet、Dialog,因为 Dialog 样式比较多,放最后讲好了 SnackBar SnackBar 的源码相对简单 const...BottomSheet BottomSheet 看命名就知道是从底部弹出的菜单,展示 BottomSheet 有两种方式,分别是 showBottomSheet 和 showModalBottomSheet...在 ListView 中增加一个 BottomSheet 的按钮,因为 BottomSheet 需要的 context 也不能是 Scaffold 下的 context,所以需要通过 Builder 进行包裹一层...get package 后给 MaterialApp 加入如下属性,这样就会支持中文了,这里需要导入包 package:flutter_localizations/flutter_localizations.dart

2.1K20

Flutter实现页面切换后保持原页面状态的3种方法

前言: 在Flutter应用中,导航栏切换页面后默认情况下会丢失原页面状态,即每次进入页面时都会重新初始化状态,如果在initState中打印日志,会发现每次进入时都会输出,显然这样增加了额外的开销,...它拥有一个固定的底部导航以及首页的顶部导航,可以看到不管是点击底部导航切换页面还是在首页左右侧滑切换页面,之前的页面状态都是始终维持的,下面就具体介绍下如何在flutter中实现类似喜马拉雅的导航效果...第一步:实现固定的底部导航 在通过flutter create生成的项目模板中,我们先简化一下代码,将MyHomePage提取到一个单独的home.dart文件,并在Scaffold脚手架中添加bottomNavigationBar...我们先在home.dart文件移除Scaffold脚手架中的appBar顶部工具栏,然后开始重写首页first_page.dart: /// first_page.dart import 'package...现在已经可以看到,不管是切换底部导航还是切换首页顶部导航,所有的页面状态都可以被保持,并且在应用第一次加载时,终端只看到recommend initState的日志,第一次切换首页顶部导航至vip页面时

2.5K30

Flutter】底部导航栏实现 ( BottomNavigationBar 底部导航栏 | BottomNavigationBarItem 导航栏条目 | PageView )

this.onDrawerChanged, this.endDrawer, this.onEndDrawerChanged, this.bottomNavigationBar, this.bottomSheet...BottomNavigationBar 导航栏底部的 BottomNavigationBarItem 组件的位置和大小 , /// 都会根据当前点击的选项而改变 , /// 改变的时候有切换动画...导航栏按钮点击事件 onTap: (pageIndex) { /// 跳转到对应的导航页面 _pageController.jumpToPage(pageIndex); setState...主要作用是调用 void jumpToPage(int page) 方法 , 进行页面跳转 ; jumpToPage 页面跳转在底部菜单栏的 onTap 点击事件中调用 , 更新当前页面后 , 需要调用 setState...滚动到边缘是否反弹 this.pageSnapping = true, // 如果设置 false , 则无法进行页面手势捕捉 this.onPageChanged, // 页面切换时回调该函数

5.7K50

告别setState()! 优雅的UI与Model绑定 Flutter DataBus使用~

Flutter开发中,大家都绕不开Widget的刷新,setState()是最简单的用法。...但随着当app的交互变得复杂,setState出现的次数便会显著增加,每次setState都会重新调用build方法,这势必对于性能以及代码的可阅读性带来一定的影响。...如何优雅的解决这个问题,不得不提到StreamBuilder,StreamBuilder是Flutter中异步构建的核心组件。许多著名的开源框架例如Bloc皆是基于此实现。...img 采用setState()的方式,我们知道很简单,建立本地变量key1,key2,然后放入对应的Text中直接展示。...其实Flutter中还提供了一个强大组件SteamBuilder来协助我们处理控件的刷新构建。 ---- StreamBuilder ? ?

2.4K41
领券