首页 > 其他分享 >flutter 的一些概念三

flutter 的一些概念三

时间:2024-09-06 18:46:55浏览次数:9  
标签:Widget Stream PlatformView Flutter 概念 controller Future 一些 flutter

本文同步发布于公众号:stringwu的互联网杂谈:flutter 的一些概念三

1 Stream 与 Future的关系

StreamFuture 都是 Flutter 中常用的异步编程模型,Future 适用于一次性异步操作,Stream 适用于连续的异步操作

1.1 Future

  • Future一次性的操作,只会返回一个结果;
  • 可以使用awaitasync 等关键字来等待结果
  • 可通过Future.then 方法来处理异步操作的结果
  • Future.timeout 来设置超进的时间

1.2 Stream

  • Stream是连续的异步操作,它可以多次返回结果;
  • 需要使用StreamController 和 StreamBuilder 来监听数据流动,并对数据进行处理;
  • 可以使用Stream.listen 方法来监听数据的流动,并进行一个处理
  • Stream.timeout 来设置超时的时间
  • 使用StreamControllerStreamSubscription 来实现数据的订阅和消费
    一个简单的实现数据订阅和消费逻辑
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的区别与联系

  • WidgetFlutter 中构建 UI 的基本单位,它描述了一个 UI 元素的外观和行为。Widget 可以是有状态的(StatefulWidget)或无状态的(Stateless Widget),可以包含其他 Widget,可以组成 Widget 树。

  • StateWidget 的状态,它描述了 Widget 在特定时间点的数据和行为。State 只能存在于有状态的 Widget 中,它可以随着时间的推移而改变,但不会影响 Widget 树的结构

  • ContextFlutter 中的上下文对象,它包含了当前 WidgetWidget 树中的位置和状态信息。Context 可以用来获取当前 ThemeMediaQueryNavigator 等信息,也可以用来创建新的 Widget。

3 PlatformView

PlatformView 可以将原生的视图嵌入到Flutter UI中,如嵌入原生地图,视频播放等。在使用中,需要通过PlatformView WidgetPlatformViewFactory 来实现:

  • 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();
      },
    );
  }
}

公众号:

标签:Widget,Stream,PlatformView,Flutter,概念,controller,Future,一些,flutter
From: https://www.cnblogs.com/WoodJim/p/18395439

相关文章

  • 进程间通信(IPC):概念、分类与信号机制(2)
    文章目录进程间通信(IPC):概念、分类与信号机制引言IPC的分类信号机制信号周期信号的产生信号的发送信号的接收信号处理示例IPC的其他方法管道通信消息队列共享内存套接字通信服务器端代码客户端代码优点与缺点优点缺点结论进程间通信(IPC):概念、分类与信号机制引言......
  • 【AI大模型】AI大模型热门关键词解析与核心概念入门
    关注公众号ai技术星球回复88即可领取技术学习资料目录导航热门AI大模型关键词解析热门AI大模型关键词解析大模型代码语言:javascript复制-"大模型"的是大型的人工智能模型,特别是在深度学习领域中。这些模型因其庞大的参数数量、复杂的网络结构和在多种任务上的......
  • AS-V1000视频监控平台客户端播放实时视频时,一些视频画面显示的时间不准确的解决方法
    目录一、背景说明二、解决过程  1、查看设备时间  2、查看服务器时间  3、ntp介绍  1)ntp的概念  2)ntp的同步方式  3)ntp的优势  4、自动校准服务器和设备时间  1)下载ntp  2)修改ntp.conf  3)重启ntp服务,自动校准时间......
  • 基础网络安全——K8S关键概念及搭建过程中遇到的问题补充
    一、K8S集群基本概念             k8s是一组服务器集群,是一个分布式的容器编排系统,对运行在集群上的容器进行管理,K8S集群包括控制平面(ControlPlane)以及1个或者多个工作节点(workernode),而控制平面包括masternode以及etcd节点。并且在这两种类型的节点上运行多种不......
  • 常见概念 -- DCM色散补偿
    色散的概念光是一种电磁波,在特定介质中,光的相速度随频率(波长)或传输模式有差异,造成光波在通过介质后,不同频率成分光波的相位形成分散或分离的效果,称为色散。日常生活中,最广为人知的色散现象是白光(复合光)通过三棱镜后形成彩色光带(光谱)的效果。在光纤传输中也存在色散效应......
  • 常见概念 -- 色度色散与偏振模色散
    色度色散(CD)由于光纤中不同波长对应不同的传输速度,不同波长到达相同距离的光纤的时间不同,从而导致光脉冲展宽。偏振模色散(PMD)由于光纤的随机性双折射,不同相位状态的光传播速度不同,使光脉冲展宽。色散对系统的影响CD色散和PMD色散造成时域上的光脉冲展宽,会引起信号......
  • 高中数学题的一些背景思考 1 —— 裴蜀定理
    1裴蜀定理「\(\in\)数论」题目设集合\(M=\left\{7m+5n\left|m,n\in\Z\right.\right\},N=\left\{3m-2n\left|m,n\in\Z\right.\right\}\)。试判断集合\(M,N\)的关系。从gcd和Euclid说起比方说我要求\(\gcd(a,b)\),不妨\(a>b\)。令\(r_0=b\),\[\begin{align......
  • 高中数学题的一些背景思考 2 —— Chebyshev 多项式
    Chebyshev多项式「\({\in}\)代数」这个家伙十分重要!可以牵扯出一堆相关的东西。题目1已知\(a,b,c\in\R,\forallx\in[-1,1]\),都有\(\left|ax^2+bx+c\right|\le1\),则当\(x\in[-1,1]\)时,函数\(f(x)=\left|\left(ax^2+bx+c\right)\left(cx^2+bx+a\right)\right|\)的最......
  • 回归の一些想法
    现在是2024.9.520:00我坐在离BJUT2公里外的一家星巴克里简短的写下这些文字距离第一次接触算法竞赛已经过去了三年“我并没有如此强大闪耀一次就足够”感谢:感谢我的父母家人对我无限的支持感谢GG带我进入OI的世界感谢KHIN、wind_whisper两位神仙给予我莫大的帮助......
  • 【机器学习】梯度提升和随机森林的概念、两者在python中的实例以及梯度提升和随机森林
    引言梯度提升(GradientBoosting)是一种强大的机器学习技术,它通过迭代地训练决策树来最小化损失函数,以提高模型的预测性能随机森林(RandomForest)是一种基于树的集成学习算法,它通过组合多个决策树来提高预测的准确性和稳定性文章目录引言一、梯度提升1.1基本原理1.1.1......