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

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

Flutter开发中,大家都绕不开Widget的刷新,setState()是最简单的用法。...如果StreamBuilder有了解可以直接看第二部分 一、局部刷新的关键点 StreamBuilder setState() 现在页面上有两个数字key1和key2需要展示,当点击上方的按钮时,我们对应修改...当我们点击按钮时使本地变量key1,key2做增加操作,之后调用setState()。 ? img ? img ? img ?...在key1的点击事件中往Stream中add数据,这样在key1的流上产生了一条数据,对应的监听者收到数据后,只更新自己的内容,不会重建其他区域。 ? ? ?...作为构建方式,其实系统中还有一些轻量的观察模式组件可供选择,例如ChangNotify等,但如果单独使用这些组件不可避免观察对象散落在页面中的各个位置,不易于管理。

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

    Flutter ——状态管理 | StreamBuild

    Stream可以接受任何类型的数据,值、事件、对象、集合、映射、错误、甚至是另一个Stream,通过StreamController中的sink作为入口,往Stream中插入数据,然后通过你的自定义监听...,而不需要任何setState: 我在代码里注释了步骤(四步): import 'dart:async'; import 'package:flutter/material.dart'; class...构造器 child: StreamBuilder( // 监听Stream,每次值改变的时候,更新Text中的内容 stream: _streamController.stream...的监听,StreamBuilder重建并刷新counter //步骤4.往StreamBuilder里添加流,数据变了,就用通知小部件 _streamController.sink.add...问题1 为何选择使用streamBuild 1.方法一使用StatefulWidget,刷新时使用setstate(){},使用setstate(){}刷新,会将整个item 进行重新构建,整个item

    3K31

    Flutter | 事件循环,Future

    正文 在 Dart 中,没有多线程的概念,所谓的异步操作全部都是在一个线程里面执行的, 并且不会造成卡顿的原因就是事件循环(Event Loop), 如下图所示,在程序的运行过程中,会有两个事件...在程序执行过程中,如果有异步操作,这个操作就会添加到队列中,当发现队列不为空时,就会然后不断的从队列中取出事件在执行 Microtask Queue 一个顶级的队列,只要这个队列里面不是空的,就一定会执行该队列中的任务...Event Queue 普通的事件队列,比 Microtask Queue 低了一个等级,在 Microtask Queue 中没有任务的时候才会执行该队列中的任务 需要异步操作的代码都会放在 EventQueue...做的小游戏 在日常开发中,StreamBuilder 还是挺实用的,这次我们用 StreamBuilder 来做一个小游戏,先看效果: 从上面的动画来看,可以将其分为三个部分,第一个部分则是底部的键盘...,最后开启动画 build 中其实是很简单的,使用了 AnimatedBuilder 来监听动画,当动画值改变后则会重新 setState(),内部就是一个小按钮,记录了题目,注意背景颜色是 0.5

    4.3K10

    【源码篇】Flutter Bloc背后的思想,一篇纠结的文章

    在我看来,这样大名鼎鼎的开源库,上面这点疙瘩完全可以避免;也许是这种莫名的高期待,让我产生了这种落差。。。...对了,说不定是Bloc作者,故意留了一个Provider刷新机制在Bloc中,把这个作为一个彩蛋! 突然感觉这点疙瘩没了!...实例了Stream流对象,来做Event的事件触发机制 添加Event事件时,会触发 _bindEventsToStates() 方法中的listener回调 _bindEventsToStates里面做了一些操作...mapEventToState中,然后mapEventToState回传State对象 然后触发listen回调,listen中,将state传emit中,然后触发刷新控件重建 总结 上面几个关键的类分析完...,整个Bloc的运行机制,一下子就明朗了 BlocProvider 负责储存 传入XxxBloc加以储存 提供的of方法,可以在BlocProvider或其子节点位置,获取到储存的XxxBloc 提供回收资源的回调

    2.4K41

    Dart 异步

    单线程模型按照代码编写的顺序,自上而下运行,这是我们所认知的,但是当遇到耗时操作(IO/网络请求)等,会给UI造成卡顿阻塞,那么在Flutter中是怎么解决这个问题的呢?...在Dart中也有自己的进程机制 – isolate。...在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境。其实默认环境就是一个main isolate。...在Dart语言中,所有的Dart代码都运行在某个isolate中,代码只能使用所属isolate的类和值。不同的isolate可以通过port发送message进行交流。...StreamBuider对官方的计数器进行改进,取代setState刷新页面,代码如下 class MyHomePage extends StatefulWidget { @override _

    1.6K20

    Flutter完整开发实战详解(十一、全面深入理解Stream)

    ); 执行 1 中得到的 _onData 对象,触发 listen 时传入的回调方法。...这就需要说到 Dart 中的异步实现逻辑了,因为 Dart 是 单线程应用 ,和大多数单线程应用一样,Dart 是以 消息循环机制 来运行的,而这里面主要包含两个任务队列,一个是 microtask 内部队列...二、StreamBuilder 如下代码所示, 在 Flutter 中通过 StreamBuilder 构建 Widget ,只需提供一个 Stream 实例即可,其中 AsyncSnapshot 对象为数据快照...image 如上图所示, StreamBuilder 的调用逻辑主要在 _StreamBuilderBaseState 中,_StreamBuilderBaseState 在 initState 、didUpdateWidget...当我们调用 onListen 时,也是将回调设置到 StreamController 中。

    4K41

    Flutter响应式编程:Streams和BLoC

    StreamBuilder监听Stream,每当某些数据输出Stream时,它会自动重建,调用其builder回调。...Stream; 在流中注入值的事实导致侦听它的StreamBuilder重建并“刷新”计数器; 我们不再需要State的概念,所有内容都通过Stream接收; 这是一个很大的改进,因为调用setState...此页面现在仅负责: 显示计数器,现在只在必要时刷新(即使页面不必知道) 提供按钮,当按钮按下时,将会在counter面板上请求一个动作 此外,整个业务逻辑集中在一个单独的类“IncrementBloc”...第四,减少“build”的数量 不使用setState()而是使用StreamBuilder大大减少了“build”的数量。 从性能角度来看,这是一个巨大的进步。...例外情况是: 在ListOnePage中,当用户点击MovieCard时,刷新MovieDetailsWidget。 这也可能是由一个stream驱动的......

    4.2K90

    Flutter完整开发实战详解(十五、全面理解State与Provider)

    3、在 _DemoPageState 中直接将传入的 data 通过 Text 显示出来。 运行后我们一看也没什么问题吧?...但是当我们点击 4 中的 setState 时,却发现 3 中 Text 没有发现改变, 这是为什么呢? ?...问题就在于前面 StatefulElement 的构建方法和 update 方法: State 只在 StatefulElement 的构建方法中创建,当我们调用 setState 触发 update...时,只是执行了 _state.widget = newWidget,而我们通过 _DemoPageState(this.data) 传入的 data ,在传入后执行setState 时并没有改变。...每个 StreamBuilder 的 snapShot 只支持一种类型,多个时要不就是多个状态合并到一个实体,要不就需要多个StreamBuilder嵌套。

    3.7K21

    Flutter完整开发实战详解(十二、全面深入理解状态管理设计)

    如下方代码所示,利用 scoped_model 实现状态管理只需要三步 : 定义 Model 的实现,如 CountModel ,并且在状态改变时执行 notifyListeners() 方法。...所以当我们通过 context 调用 inheritFromWidgetOfExactType 时,就可以往上查找到父控件的 Widget,从在 scoped_model 获取到 _InheritedModel...利用 StreamBuilder 加载监听 Stream 数据流,通过 snapShot 中的 data 更新控件。...6、Store 对象内部的 subscribe 方法,会在 ComponentState 中添加订阅方法 onNotify,如果调用在 onNotify 中最终会执行 setState更新UI。...9、以上流程最终就是 Dispatch 触发 Store 内部 _notifyController , 最终会触发 ComponentState 中的 onNotify 中的setState更新UI

    2.1K20

    Dart | 你知道 sync*async* 是怎么用的吗?

    平时我们在写业务逻辑的时候,肯定都会与网络打交道,那肯定也就避免不了异步请求,代码类似如下: int getData() async { Response r = await Dio().get('...print(i); } print('foo1 stop'); } 当我们在 main函数里运行,结果大家应该都很清楚: foo1 start 0 1 2 foo1 stop 那所谓的函数生成器呢...foo2,当前index:${i}'); yield i; } print('foo2 stop'); } 这回我们在 main 函数里运行 foo2(),会出现什么效果?...(){ //业务逻辑 }; }); } } 这里使用循环,然后每一秒钟请求依次接口,返回数据后 setState(); 这样肯定不行,因为你不可能一两秒钟就 setState...,我们可以用 StreamBuilder 来包住,这样每次返回数据就不用 setState() 了。

    2.3K41

    Flutter 实践 MVVM

    Flutter 实践 MVVM 在做Android或iOS开发时,经常会了解到MVC,MVP和MVVM。MVVM在移动端一度被非常推崇,虽然也有不少反对的声音,不过MVVM确实是不错的设计架构。...在做flutter开发时,刚学习时写的很随意,什么东西都写一起,也不去考虑解耦等问题。但是实际生产开发是不能这样做的,否则项目稍大就无法维护。...在Flutter中,一切UI皆Widget,那么View层也很明确了,就是Widget部分。...在android中,有DataBinding技术,直接将XML和ViewModel绑定起来。iOS里,也可以通过ReactiveCocoa来实现数据的双向绑定。...,在stream参数给上我们ViewModel的output stream,也就是说当ViewModel中的Sink对象被add数据后,StreamBuilder会监听到这个变化,然后重新通过builder

    10.2K70

    Flutter 中的 Shimmer 动画效果

    加载时间在应用程序改进中是不可避免的。从用户体验 (UX) 的角度来看,主要是向您的用户展示正在加载。...处理向用户传递信息正在加载的一种主流方法是在不准确的加载物质类型的形状上显示带有微光动画的铬色调。 在在这篇博客中,我们将探索 Flutter 中的 Shimmer 动画效果。...Shimmer 用于在应用程序中从服务器加载内容时添加精彩的动画。这使 UI 看起来更具响应性。...此演示视频展示了如何在颤动中创建微光动画效果。它展示了如何在 Flutter应用程序中使用shimmer包来实现微光动画效果。...它显示代码何时成功运行,然后显示内容正在从虚拟数据加载是带有持续时间的微光动画效果,然后加载完成然后内容将显示在您的设备上。

    6.2K20
    领券