首页
学习
活动
专区
圈层
工具
发布

【Flutter 专题】46 图解新的状态管理 Provider (一)

获取数据 Provider 需要在数据绑定的子 Widget 中进行获取;使用静态方法 Provider.of(BuildContext context),此方法从 BuildContext 关联的...Widget Tree 中查找最近的相同类型的数据进行展示;没有则报异常; Text('${Provider.of(context)}'), Text('FirstPage Provider...作用域 和尚在刚开始学习时被作用域卡到,实际文档说的很明白,获取绑定数据的范围是在绑定数据的子 Widget 中;和尚绘制了一下个人理解的基本作用域图,如有错误请多多指导; ?...对 ChangeNotifier 进行监听,将其公开给它的子 Widget 并重建依赖项; 1....问题小结 和尚在开始尝试时总是遇到如下问题,Could not find the correct Provider… 测试后了解是在子 Widget 中层级查找未找到对应的绑定数据;极有可能是绑定数据的

2.4K41

【 源码之间 - Flutter 】 FutureBuilder 使用

FutureBuilder组件类 FutureBuilder是一个具有泛型T的类,T代表异步的数据类型,这里也就是List FutureBuilder是一个StatefulWidget...,主要有三个成员变量: 1】. future:Future 类型----待执行的异步任务 2】. builder:AsyncWidgetBuilder类型----异步组件构造器 3】...方法来创建组件,其中会回调_snapshot给外界使用 这时_snapshot的状态是waiting; @override Widget build(BuildContext context)...void _unsubscribe() { _activeCallbackIdentity = null; } ---- FutureBuilder的源码也就这些,看到了也就不是很难。...说白了就是在封装一下异步任务执行情况,本质也是靠setState进行更新子组件。 ---- 尾声 欢迎Star和关注FlutterUnit 的发展,让我们一起携手,成为Unit一员。

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

    【 源码之间 - Flutter 】 FutureBuilder源码分析

    ---- 一、示例demo详述: 1.关于异步请求 FutureBuilder需要一个异步任务作为构造入参 通过wanandroid的开发api进行文章列表的获取, Api.fetch(int page...,主要有三个成员变量: 1】. future:Future 类型----待执行的异步任务 2】. builder:AsyncWidgetBuilder类型----异步组件构造器 3】....方法来创建组件,其中会回调_snapshot给外界使用 这时_snapshot的状态是waiting; @override Widget build(BuildContext context) =...void _unsubscribe() { _activeCallbackIdentity = null; } 复制代码 ---- FutureBuilder的源码也就这些,看到了也就不是很难。...说白了就是在封装一下异步任务执行情况,本质也是靠setState进行更新子组件。 ---- 尾声 欢迎Star和关注FlutterUnit 的发展,让我们一起携手,成为Unit一员。

    2.5K10

    Flutter中Stack层叠组件以及与Align、Positioned组件实现定位布局

    Stack 组件 Stack 表示堆的意思,用此组件修饰的子组件会“堆”在一起。 常见属性: 1. alignment 对齐方式。值的类型为Alignment; 2. children 子组件。...值的类型为Widget; 代码示例: import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } // 抽离成一个单独的组件...Stack与Align实现定位 Align组件专用于修饰子组件的对齐方式。 常见属性: 1. alignment 对齐方式。值的类型为Alignment; 2. children 子组件。...常见属性: 1. top 子元素距离顶部的距离。值的类型为int; 2. bottom 子元素距离底部的距离。值的类型为int; 3. left 子元素距离左侧距离。...值的类型为int; 4. right 子元素距离右侧距离。值的类型为int; 5. child 子组件。

    1.3K20

    【Flutter】744- Flutter 最佳实践

    '^([a-z]+):'); void sum(int bookPrice) { // ... } 2. lib中的文件使用相对路径导入 当同时使用相对和绝对导入时,从两种不同的方式导入同一类时,...指定变量类型 当值的类型已知时,请务必指定成员的类型,尽可能避免使用 var //Don't var item = 10; final car = Car(); const timeOut = 2000...避免使用 as 作类型转换,应使用 is 运算符 通常,如果无法进行强制转换,使用 as 强制转换将会引发异常,为了避免异常,可以使用 is //Don't (item as Animal).name...Text("Android") : Container(), ] ); } //Do Widget getText(BuildContext context) { return Row...拆分 Widget 当调用 setState() ,所有后代 Widget 都将重建,因此,将 Widget 拆分为小的 Widget ,在真正需要改变的 Widget 上调用 setState() Scaffold

    1.6K21

    FlutterDojo设计之道—状态管理之路(六)

    同时创建其Child,这个风格和InheritedWidget是不是有异曲同工之妙。...简单的说,就是在button的event handler中,触发了Provider.of,但是这个时候,传入的Context并不在Widget中,导致notifyListeners出错。...解决方法有两个,一个就是将Provider.of抽取出来,用Widget的Context来获取Model,另一个呢,就是通过Provider.of的另一个参数来去掉监听的注册。...Model Rebuild的问题,例如上面的Selector,指定了需要在TestModel中寻找int类型的数据,其过滤条件是TestModel中的modelValueA这样一个int类型的数据,根据...其实很简单,就是实现多种不同的数据类型,在这些数据模型中,找到需要监听的那一种类型,这种情况比较常用于多个数据模型中具体共同参数的场景。

    1.2K10

    Flutter框架分析(三)-- Widget,Element和RenderObject

    是的,State对应的Widget实例只要是相同类型的是可以被换来换去的。 函数setState()我们很熟悉了。...InheritedWidget InheritedWidget既不是StatefullWidget也不是StatelessWidget。它是用来向下传递数据的。...在InheritedWidget之下的子节点都可以通过调用BuildContext.inheritFromWidgetOfExactType()来获取这个InheritedWidget。...现在你知道你写在StatelessWidget里的build()是在哪里被调用的了吧。而且你看,build()函数的入参是this。我们都知道这个函数的入参应该是BuildContext类型的。...我们都知道这个函数的入参应该是BuildContext类型的。这个入参其实就是这个StatefulElement。 我们都知道State有状态,当状态改变时对应的回调函数会被调用。

    1.7K10

    flutter如何进行状态管理

    3、将封装的状态放在组件最高层,因为 Provider 实际上是 InheritedWidget 的语法糖,所以通过 Provider 传递的数据从数据流动方向来看,是由父到子(或者反过来),所以一般就是把资源放到更高的层级...所以,我们直接在 MaterialApp 的外层使用 Provider 进行包装,就可以把数据资源依赖注入到应用中,这里需要注意的是,由于封装的数据资源不仅需要为子 Widget 提供读的能力,还要提供写的能力...而如果只需要为子 Widget 提供读能力,直接使用 Provider 即可。 4、在子组件中通过of方法获取属性与方法,部署状态。...,再看一个案例,如图: 图上是两个兄弟组件,我在在一个组件中展示数据,在另一个组件中点击按钮数据发生改变。...:_counter = Provider.of(context),首先注意调用的地方,是在build函数中,因为在build函数中可以访问到context,然后是of函数的返回值的类型是封装的数据状态

    1.8K11

    【源码篇】Flutter GetX深度剖析 | 我们终将走出自己的路(万字图文)

    我写这篇文章,并不是为GetX正名 我自问自己并不是任何一个状态框架的死忠者,Provider和Bloc,我写了相关使用、原理剖析文章和相关代码生成插件 在我心中,这类框架并没有多么神秘 因为对其原理较熟...的子类) 的子节点,通过子节点的BuildContext(Element是BuildContext的实现类),都可以无缝的取数据 var transferDataElement = context.getElementForInheritedWidgetOfExactType...Element中做了一个父节点向子节点赋值的操作:整个数据传输链清晰了 abstract class Element extends DiagnosticableTree implements BuildContext...储存了数据,跳转到B页面或者C页面,会发现使用context获取不到A页面的InheritedElement 这侧面证明了Navigator路由跳转:A页面跳转B页面,B页面并不是A页面的子节点 大致结构...:变量的赋值,类型标定,刷新都很正常写法有差异,不熟悉该写法的人,看了后,会很难受 因为对所有类型重新封装,经过上面的代码回溯,大家也发现,封装类型的代码相当多;封装类型占用资源肯定要比dart自带类型的大

    5.4K53

    InheritedWidget使用说明

    此时,我们需要一种机制,能够让某一个节点下的所有子节点,访问该节点下的数据。 InheritedWidget就满足了我们这一需求。...所以,在构造方法中,我们需要传入两个参数,一个是我们希望共享的数据(在本例中数据是int型,实际业务中共享的通常是一个相对复杂的数据),另一个就是我们带界面的Widget。...最近的指定类型的Widget,并且此Widget必须是InheritedWidget的子类。...值得注意的是,它是一个静态方法。所以,只要是相同BuildContext我们即可以在任意子节点上,通过这个静态方法,获取到我们的InheritedWidget,然后读取或修改它的共享数据。...一旦某个节点的Widget继承了InheritedWidget,那么它的子节点,不论深度是多少,都可以获取到继承了InheritedWidget的Widget,并取得其中的数据成员。

    1.2K40

    Flutter | 事件循环,Future

    在程序执行过程中,如果有异步操作,这个操作就会添加到队列中,当发现队列不为空时,就会然后不断的从队列中取出事件在执行 Microtask Queue 一个顶级的队列,只要这个队列里面不是空的,就一定会执行该队列中的任务...')) .catchError((value) => print('异常状态')); 复制代码 我们程序中的大部分异步操作都是围绕着这三种状态进行的。...('已完成状态')).catchError((value) => print('异常状态')); 创建一个以异常结束的 Future,上面代码最终会执行到 catchError 中。...((value) => print(value)); print("end -------------->"); } // async 会将返回的结果封装为 Future 类型 getNetData...: (BuildContext context, AsyncSnapshotdynamic> snap) { //如果有数据 if (snap.hasData

    4.9K10

    FlutterDojo设计之道—状态管理之路(四)

    当Child Widget想要跨Widget拿到其它Widget的数据时,通常就需要使用构造函数,将数据一层层传递到Child Widget,这显然不是一个好的解决方案,不仅让Widget之间有了很大的耦合...当把InheritedWidget作为Widget Tree的根节点时,这个Widget Tree就具有了一些新的功能,例如,Child Widget可以根据BuildContext找到最近的指定类型的...InheritedWidget,而不是通过Widget Tree的构造函数一层层进行传递,如下图所示。...要注意的是,虽然这里的StatefulWidget通过setState来修改数据了,但其子Widget并不会全部重绘,因为InheritedWidget的存在,Child Widget会有选择性的进行重绘...要想解决这个问题也非常简单,那就是在不需要监听的时候,使用findAncestorWidgetOfExactType即可,这个函数只会返回指定类型的Widget,而不会将监听加入订阅者列表中。

    68820
    领券