flutter 的一些概念三
本文同步发布于公众号:stringwu的互联网杂谈:flutter 的一些概念三
1 Stream 与 Future的关系
Stream 和 Future 都是 Flutter 中常用的异步编程模型,Future 适用于一次性异步操作,Stream 适用于连续的异步操作
1.1 Future
Future一次性的操作,只会返回一个结果;- 可以使用
await和async等关键字来等待结果 - 可通过
Future.then方法来处理异步操作的结果 Future.timeout来设置超进的时间
1.2 Stream
- Stream是连续的异步操作,它可以多次返回结果;
- 需要使用StreamController 和 StreamBuilder 来监听数据流动,并对数据进行处理;
- 可以使用Stream.listen 方法来监听数据的流动,并进行一个处理
- Stream.timeout 来设置超时的时间
- 使用
StreamController和StreamSubscription来实现数据的订阅和消费
一个简单的实现数据订阅和消费逻辑
StreamController<int> _controller = StreamController<int>();
_controller.add(1);
_controller.add(2);
_controller.add(3);
// 订阅和消费
StreamSubscription<int> _subscription = _controller.stream.listen((int value) {
print(value);
});
2 Widget、State、Context的区别与联系
Widget是Flutter中构建 UI 的基本单位,它描述了一个 UI 元素的外观和行为。Widget可以是有状态的(StatefulWidget)或无状态的(Stateless Widget),可以包含其他Widget,可以组成 Widget 树。State是Widget的状态,它描述了Widget在特定时间点的数据和行为。State只能存在于有状态的Widget中,它可以随着时间的推移而改变,但不会影响Widget树的结构Context是Flutter中的上下文对象,它包含了当前Widget在Widget树中的位置和状态信息。Context可以用来获取当前Theme、MediaQuery、Navigator等信息,也可以用来创建新的 Widget。
3 PlatformView
PlatformView 可以将原生的视图嵌入到Flutter UI中,如嵌入原生地图,视频播放等。在使用中,需要通过PlatformView Widget和 PlatformViewFactory 来实现:
PlatformView Widget用于将原生视频嵌入到应用中;PlatformViewFactory主要用来创建PlatformView Widget并将原生视图与PlatformView Widget进行关联;
3.1简单的使用示例(以Android为例)
首先在原生代码中创建一个自定义的PlatformView
// 步骤1 创建一个自定义的PlatformView
class DemoAView :PlatformView {
// 里面的内容就和在原生中实现自定义View一样
.....
}
// 步骤2 再创建一个Factory来创建PlatformView
class DemoAViewFactory : PlaformViewFactory {
override fun create(context: Context, id: Int, args: Any?): PlatformView {
// 返回一个PlatfromView
return DemoAView(context)
}
// 步骤2 在Flutter引擎初始化时,注册一下步骤2创建的factory
// 这个方法是在FlutterFragment中,如果使用的是FlutterActivity,也类似
fun configureFlutterEngine(@NonNull flutterEngine :FlutterEngine ) {
flutterEngine
.getPlatformViewsController()
.getRegistry()
// 注意,这个id 需要是唯一的
.registerViewFactory("demo_a", DemoAViewFactory());
}
然后就可以在Flutter 代码中去使用这个PlatformView (在Flutter 中可以使用PlatformViewLink 来简化使用,也可以使用AndroidView 和UIKitView 来使用,本文使用PlatformViewLink 来做示例:
class DemoViewWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return PlatformViewLink(
viewType: "demo_a",
surfaceFactory: (context, controller) {
if (controller is! AndroidViewController) {
return Container(); // 或者返回一个占位符widget
}
return AndroidViewSurface(
controller: controller,
gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
);
},
onCreatePlatformView: (params) {
return PlatformViewsService.initAndroidView(
id: params.id,
viewType: "demo_a,
layoutDirection: TextDirection.ltr,
creationParams: {},
creationParamsCodec: const StandardMessageCodec(),
onFocus: () {
params.onFocusChanged(true);
},
)
..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
..create();
},
);
}
}
公众号:

flutter 的一些概念三的更多相关文章
- 做一个合格的Team Leader -- 领导和管理基本概念 三种激励手段:恐吓、贪念、承诺
做一个合格的Team Leader -- 基本概念 1.领导和管理 人们乐于被领导:他们不喜欢被管理,不喜欢像牛一样被驱赶或指挥. 管理者强迫人们服从他们的命令,而领导者则会带领他们一起工作. ...
- 一、HTML概述 二、web相关的概念 三、HTML的常用标签
一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...
- 理解 Flutter 的基础概念:Widget
Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...
- TCP的基本概念三次握手,四次挥手
TCP的特性 TCP提供一种面向连接的.可靠的字节流服务 在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP TCP使用校验和,确认和重传机制来保证可靠传输 TCP使用累积确认 TCP ...
- Flutter学习笔记(三)-- 事件交互和State管理
先来看看准备界面: image.png 目标是修改图中红色实线框中的喜欢和不喜欢的五角星的修改,以及数字的修改. 在修改之前,有必要先了解一些相关的信息. 知识点 前面简单的提到过,有些Widget是 ...
- Docker 基本概念(三)-生命周期详解(镜像、容器、仓库)
Docker三大组件:镜像.容器.仓库. 一.镜像 1 从仓库获取镜像 #一.从仓库获取镜像,帮助命令:docker pull -help 命令:docker pull [选项] [docker R ...
- 新概念英语三 新东方主讲Lesson1
新概念二 Lesson95 词汇 ①get a shock 吓了一跳,得到一个惊喜 例:his wife got a shock get into a such mess 这么不幸搞得一片狼籍弄得这样 ...
- Flutter Plugin开发流程
这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...
- 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
导语 发布app后,开发者最头疼的问题就是如何解决交付后的用户侧问题的还原和定位,是业界缺乏一整套系统的解决方案的空白领域,闲鱼技术团队结合自己业务痛点在flutter上提出一套全新的技术思路解决这个 ...
- 使用Flutter完成10个商业项目后的经验教训
作者:Łukasz Kosman 和 Jakub Wojtczak 原文:https://medium.com/swlh/lessons-learned-after-making-the-first- ...
随机推荐
- 认识鸿蒙Context
Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理).applicationInfo(当前应用信息).dir(应用文件路径).area(文件分 ...
- 一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
前言 在.NET开发中,为了准确统计对应方法的执行时间,我们最常用的方式是手动使用 Stopwatch 来显式编写计时逻辑,但是假如你需要大量的使用 Stopwatch 来进行耗时统计的话不利于保持代 ...
- 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)
bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件.当执行压缩任务完成后,会生成一个以".bz2"为后缀 ...
- .NET Core 反射底层原理浅谈
简介 反射,反射,程序员的快乐. 前期绑定与后期绑定 在.NET中,前期绑定(Early Binding)是指在编译时就确定了对象的类型和方法,而后期绑定(Late Binding)或动态绑定是在运行 ...
- AI智能学生体测小程序解决方案
引言: 近年来,随着教育理念的提升,对学生综合素质的教育越发重视,特别是越发重视学生的身体素质提升,各阶段的升学考试也将体测纳入考核范围.学校也推出了各种体测锻炼促进手段,今天为您介绍一个基于小程序的 ...
- JAVA反序列化学习-前置知识(基于ysoserial)
本人在学习Java反序列化中,发现网上大多都是自己分析一些逻辑内容,导致可能每一个版本的payload都不相同,对于学习时并不友好,所以我在学习了cc链之后,准备总结一下cc链中的内容,并以ysose ...
- bootstrap-fileinput使用手册
一.准备 1.插件下载地址:https://github.com/kartik-v/bootstrap-fileinput/ 下载后的压缩包解压文件夹内容如下: js:插件核心js代码,引用filei ...
- pycharm之debugger使用
1.未打断点运程序,输出全部结果 2.打断点后,点击debug,代码执行到断点前停止(断点所在行不执行) 3.step over,是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子 ...
- AI让照片跳舞,人人都能是舞王!Swan下载介绍
最近,兵马俑.马斯克以及各地网友跳科目三和网红舞的视频陆续在社交媒体和朋友圈刷屏,这些大约10秒左右的视频都不是真人出镜,均由大模型生成,这种低门槛的跳舞方式引发了网友的广泛体验,掀起了一波斗舞狂潮「 ...
- InheritableThreadLocal 父子线程值传递
最近项目中使用 @Async 异步远程调用的时候,发现主线程能拿到 token 值,子线程调用的时候 token 为 null.研究了一番,发现可以直接使用 InheritableThreadLoca ...