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- ...
随机推荐
- Lncpc2024 游记
Day 0 7:30 起的比较早,和同学xjt约好了一起写作业,起来之后感觉身上有点冷,之前考CSP的时候就有点感冒,所以决定洗个热水澡,出来就写作业了. 9:30 学习状态还可以,比较沉浸式,这个时 ...
- 【已解决】无法打开受保护的PDF
笔者在使用三星笔记导入PDF时提示"无法打开受保护的PDF",经查询需要使用在线破解工具来破解,重新下载就可以了 方法一:在线破解网站(适用于文件较小的PDF) 这里提供两个破解在 ...
- Nuxt.js 应用中的 schema:written 事件钩子详解
title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon exce ...
- 前端稳定性工具-Sentry
什么是Sentry? Sentry本质上是一个服务器端的应用程序,它接收来自客户端(如Web应用程序.移动应用程序或后端服务)的错误日志,然后对这些日志进行聚合.分析和可视化.它提供了详细的错误报告, ...
- 2023年10月,红米(小米)note 8 pro 优化记
看了红米的note 13 pro和note 12 turbo的参数和价格后,我决定下单买个note8 pro的手机壳,确实有新手机的感觉了. 我note8 pro手机参数如下 MIUI 12.0.5 ...
- Struts2漏洞复现
Struts2漏洞复现 靶场环境:/vulhub/struts2大多都是OGNL注入 是什么: Struts2是一个基于MVC设计模式的Web应用框架 识别: 1.通过网页后缀来进行判断,如.do或者 ...
- 使用tensorboard可视化模型
Tensorboard是TF自带的可视化工具.它可以让我们从各个角度观察与修改模型,比如观察模型在训练时的loss动态变化曲线而无需在迭代完毕后再画图.绘制神经网络的结构图.调节超参数等.下面以最简单 ...
- MyBatis源码研究-缓存
在学习Hibernate中,经常有看到一级缓存和二级缓存的概念,并且有了解到,一级缓存是session级别的缓存一般缓存在内存中,二级缓存是指sessionfactory级别的缓存,一般缓存在内存或者 ...
- Java垃圾回收器总结
什么是Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation).自动回收( ...
- Impala源代码分析(2)-SQL解析与执行计划生成
7 Replies Impala的SQL解析与执行计划生成部分是由impala-frontend(Java)实现的,监听端口是21000.用户通过Beeswax接口BeeswaxService.que ...