本文同步发布于公众号: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 的一些概念三的更多相关文章

  1. 做一个合格的Team Leader -- 领导和管理基本概念 三种激励手段:恐吓、贪念、承诺

    做一个合格的Team Leader -- 基本概念 1.领导和管理   人们乐于被领导:他们不喜欢被管理,不喜欢像牛一样被驱赶或指挥.   管理者强迫人们服从他们的命令,而领导者则会带领他们一起工作. ...

  2. 一、HTML概述 二、web相关的概念 三、HTML的常用标签

    一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...

  3. 理解 Flutter 的基础概念:Widget

    Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...

  4. TCP的基本概念三次握手,四次挥手

    TCP的特性 TCP提供一种面向连接的.可靠的字节流服务 在一个TCP连接中,仅有两方进行彼此通信.广播和多播不能用于TCP TCP使用校验和,确认和重传机制来保证可靠传输 TCP使用累积确认 TCP ...

  5. Flutter学习笔记(三)-- 事件交互和State管理

    先来看看准备界面: image.png 目标是修改图中红色实线框中的喜欢和不喜欢的五角星的修改,以及数字的修改. 在修改之前,有必要先了解一些相关的信息. 知识点 前面简单的提到过,有些Widget是 ...

  6. Docker 基本概念(三)-生命周期详解(镜像、容器、仓库)

    Docker三大组件:镜像.容器.仓库.  一.镜像 1 从仓库获取镜像 #一.从仓库获取镜像,帮助命令:docker pull -help 命令:docker pull [选项] [docker R ...

  7. 新概念英语三 新东方主讲Lesson1

    新概念二 Lesson95 词汇 ①get a shock 吓了一跳,得到一个惊喜 例:his wife got a shock get into a such mess 这么不幸搞得一片狼籍弄得这样 ...

  8. Flutter Plugin开发流程

    这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...

  9. 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题

    导语 发布app后,开发者最头疼的问题就是如何解决交付后的用户侧问题的还原和定位,是业界缺乏一整套系统的解决方案的空白领域,闲鱼技术团队结合自己业务痛点在flutter上提出一套全新的技术思路解决这个 ...

  10. 使用Flutter完成10个商业项目后的经验教训

    作者:Łukasz Kosman 和 Jakub Wojtczak 原文:https://medium.com/swlh/lessons-learned-after-making-the-first- ...

随机推荐

  1. 使用pandas进行数据分析

    目录 1.pandas的特点 2.Series 2.1新建Seriws 2.2使用标签来选择数据 2.3 通过指定位置选择数据 2.4 使用布尔值选择数据 2.5 其他操作 2.5.1 修改数据 2. ...

  2. Docker制作私有镜像仓库

    构建私有仓库 启动Docker Registry,使用Docker官方提供的Registry镜像就可以搭建本地私有镜像仓库,具体指令如下. docker run -d -p 5000:5000 --r ...

  3. MMdetection 问题报错 mmdet/evaluation/metrics/coco_metric.py data[‘category_id’] = self.cat_ids[label] IndexError: list index out of range

    方案一:有人说 在自己定义的 conifg文件中增加 metainfo = { 'classes': ('class1','class2', 'class2',), 'palette': [ (220 ...

  4. KindleVocab 教程,Kindle导出查词记录成文本文档,Kindle导出查询单词记录导入Anki

    程序功能 因本人使用Kindle Mate导出觉得复杂,特意写了个自用的导出程序(有linux版本和win两个版本). 所以 KindleVocab 只有一个作用:导出Kindle查询过的生词和生词所 ...

  5. VUE懒加载的table前端搜索

    // 前端搜索 fliterData() { const search = this.search if (search) { this.blist = this.list.filter(item = ...

  6. openjdk和jdk的区别与联系

    使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢?历史上的原 ...

  7. 推荐给初级Java程序员的3本进阶书

    ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...

  8. MongoDB之常见错误

    总结开发中常见的问题与错误 1. Robo 3T连接MongoDB异常: Network error while attempting to run command 'saslStart' on ho ...

  9. manim边做边学--圆柱体

    Cylinder是Manim中用于创建圆柱体对象的类. Cylinder类在制作数学.物理或工程领域的动画时,可用于以下的场景中: 演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方 ...

  10. 如何TypeScript中相对优雅地实现类的多继承

    首先,在 js 中还没有真正的多继承.但是在实际工作中经常需要抽离通用模块并按需组成新的业务模块,这就对类的多继承有了实际需求. 举个例子,现在我们有个基础类 Animal : class Anima ...