Flutter系列:关于ensureInitialized()

Flutter系列
关于ensureInitialized()

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139023416
HuaWei:https://bbs.huaweicloud.com/blogs/428871

【介绍】:显式调用WidgetsFlutterBinding.ensureInitialized()的主要目的是确保Flutter框架的核心服务和资源在runApp之前已经初始化。这对于需要在runApp之前执行依赖于Flutter框架的初始化操作(如访问平台通道、初始化插件等)是必要的。通过确保WidgetsFlutterBinding已经初始化,可以避免潜在的错误和不稳定性,确保应用的正常运行。

flutter-ljc


1. WidgetsFlutterBinding简介

在Flutter中,不同的Binding类负责不同的功能模块,它们共同协作,提供了一个完整的Flutter应用运行环境。了解这些Binding类的职责和作用,有助于我们更好地理解Flutter框架的工作原理,并在需要时进行定制和扩展。
WidgetsFlutterBinding各种底层Binding类结合在一起,提供一个完整的Widgets框架绑定。在很多时候,我们使用WidgetsFlutterBinding来初始化Flutter应用。它内部会自动初始化所有必要的底层Binding类。例如:

void main() {
  // 使用WidgetsFlutterBinding来初始化Flutter应用
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

2. 什么时候WidgetsFlutterBinding.ensureInitialized()?

在大多数情况下,Flutter应用可以在不显式调用WidgetsFlutterBinding.ensureInitialized()的情况下正常运行。这是因为runApp函数会自动初始化WidgetsFlutterBinding,如果它还没有被初始化的话。

那么为什么需要WidgetsFlutterBinding.ensureInitialized()?——更好的问题是什么时候才需要WidgetsFlutterBinding.ensureInitialized()?

2.1 在runApp之前需要执行一些初始化操作

如果你需要在调用runApp之前执行一些依赖于Flutter框架的初始化操作(如访问平台通道、初始化插件等),你需要确保WidgetsFlutterBinding已经初始化。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 在这里执行一些初始化操作
  runApp(MyApp());
}

2.2 在测试环境中

在使用flutter_test包进行单元测试时,测试框架会使用TestWidgetsFlutterBinding来替代WidgetsFlutterBinding。在这种情况下,显式调用ensureInitialized可以确保正确的绑定被初始化。

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();
  // 在这里执行一些测试初始化操作
}

2.3 在某些特定的插件初始化中

有些插件可能需要在runApp之前进行初始化,这时你需要确保WidgetsFlutterBinding已经初始化。

3. 为什么WidgetsFlutterBinding.ensureInitialized()

原因就在于,某些初始化操作依赖于Flutter框架的底层机制,而这些机制只有在WidgetsFlutterBinding被初始化后才能正常工作。WidgetsFlutterBinding是Flutter框架与底层引擎之间的桥梁,它初始化了许多关键的服务和系统资源,如平台通道、插件系统、渲染引擎等。接下来针对几个情况进行讨论。

3.1 平台通道

平台通道用于在Flutter和原生平台(如Android和iOS)之间传递消息。如果你在runApp之前需要通过平台通道与原生平台进行通信,必须确保WidgetsFlutterBinding已经初始化,否则平台通道可能无法正常工作。

void main() {
   WidgetsFlutterBinding.ensureInitialized();
   // 现在可以安全地使用平台通道
   const platform = MethodChannel('com.example/app');
   platform.invokeMethod('initialize');
   runApp(MyApp());
}

3.2 插件初始化

一些插件在初始化时需要访问Flutter框架的资源或服务,如访问文件系统、网络请求等。如果这些插件在runApp之前初始化,必须确保WidgetsFlutterBinding已经初始化。

void main() {
   WidgetsFlutterBinding.ensureInitialized();
   // 初始化插件
   await SomePlugin.initialize();
   runApp(MyApp());
}

3.3 访问Flutter框架的其他服务

WidgetsFlutterBinding初始化了许多Flutter框架的核心服务,如调度器、渲染引擎、手势处理等。如果你在runApp之前需要访问这些服务,必须确保WidgetsFlutterBinding已经初始化。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 访问调度器服务
  SchedulerBinding.instance.addPostFrameCallback((_) {
    print('Frame callback');
  });
  runApp(MyApp());
}

4. 小结

显式调用WidgetsFlutterBinding.ensureInitialized()的主要目的是确保Flutter框架的核心服务和资源在runApp之前已经初始化。

这对于需要在runApp之前执行依赖于Flutter框架的初始化操作(如访问平台通道、初始化插件等)是必要的。通过确保WidgetsFlutterBinding已经初始化,可以避免潜在的错误和不稳定性,确保应用的正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/707961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 proxy对象转为原始对象

https://cn.vuejs.org/api/reactivity-advanced.html#toraw import { toRaw } from "vue";const foo {} const reactiveFoo reactive(foo)console.log(toRaw(reactiveFoo) foo) // true 人工智能学习网站 https://chat.xutongbao.top

18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务

大家好,今天给大家分享的是一个开源的面向列的关系数据库管理系统(RDBMS)。 DuckDB是一个嵌入式的分析型数据库,它提供了高性能的数据分析和数据处理能力。DuckDB的设计目标是为数据科学家、分析师和数据工程师提供一个快速、灵活且易于使用的数据分析工…

『SD』场景变换魔法:InstructP2P控制类型助你一键换天气

本文简介 InstructP2P 控制类型是 ControlNet 插件中的一个强大功能,InstructP2P 的主要能力是实现场景转换,风格迁移。 我将绫波丽的形象从她原本身着机甲、在夜空下站着的场景,转换到春意盎然的环境中,四周环绕着绽放的花朵和嫩绿的新叶。…

如何基于Excel文件图形化从零建表并导入数据(以MySQL和SQLynx为例)

目录 1. 准备Excel数据 2. 导入Excel数据 a. 登录SQLynx b. 导入Excel文件 3. 验证数据 4. 使用和管理表 5. 总结 在实际的业务过程中,我们经常会有很多数据存储在Excel中,但在Excel中的数据分析不如使用SQL和数据库方便,数据量大些的…

蒂姆·库克解释Apple Intelligence和与ChatGPT合作的区别|TodayAI

在2024年全球开发者大会(WWDC 2024)上,苹果公司首席执行官蒂姆库克(Tim Cook)隆重介绍了公司的最新人工智能(AI)计划——Apple Intelligence,并宣布了与OpenAI的ChatGPT的合作。虽然…

大型语言模型(LLMs)是如何工作的?

大型语言模型(LLMs)如ChatGPT、Bing的“Sydney”模式和Google的Bard正在占据新闻头条。与其讨论它们将使哪些工作变得过时,本文将探讨这些模型的工作原理,包括它们从哪里获取数据以及使它们能够生成令人信服的真实文本的基本数学方…

【课程总结】Day8(上):深度学习基本流程

前言 在上一篇课程《【课程总结】Day7:深度学习概述》中,我们了解到: 模型训练过程→本质上是固定w和b参数的过程;让模型更好→本质上就是让模型的损失值loss变小;让loss变小→本质上就是求loss函数的最小值&#xf…

Postman接口测试工具详解(高清图例)

一、引言 1. 介绍接口测试的重要性 在当今软件开发领域,接口(API)已成为不同系统、服务或组件之间交互的桥梁。随着微服务架构的普及,接口的重要性日益凸显。然而,接口的复杂性和多样性也带来了诸多挑战,其…

【中间件】Pulsar集群安装

目录 一、Pulsar介绍 1.1 Pulsar基本介绍 1.2 Pulsar架构 Producer & Consumer Apache Zookeeper Pulsar Brokers Apache Bookkeeper 二、Zookeeper集群安装 三、Pulsar集群安装 3.1 bookie与broker配置 3.1.1 修改bookie配置文件 3.1.2 修改broker配置文件 3…

轮到国产游戏统治Steam榜单

6月10日晚8点,《黑神话:悟空》实体版正式开启全款预售,预售开启不到5分钟,所有产品即宣告售罄。 Steam上,《黑神话:悟空》持续占据着热销榜榜首的位置。 但在《黑神话:悟空》傲人的光环下,还有一款国产游戏取得出色的成绩。 6月10日&#…

32T存储删除视频的恢复方法

由于存储技术的发展和普及目前很多行业都开始使用小型存储,NAS可以通过网络进行数据上传和读取,使用极为方便。但是由于NAS设备容量较大且碎片较多,所以此类设备删除或者格式后恢复难度是比较大的,下边我们来分享下32T存储的恢复方…

Android面试题之ActivityManagerService的启动流程

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 SystemServer启动 创建SystemContex 用于加载系统相关的资源,比如theme,android命名空间下的资源等创建引导服务&#…

关于Ubuntu24.04嘉立创EDA无法启动的问题

关于Ubuntu24.04嘉立创EDA无法启动的问题 查看无法启动原因解决办法1解决办法2 查看无法启动原因 在终端使用启动文件命令报错 解决办法1 输入如下命令可以正常启动 ./lceda-pro --no-sandbox 解决办法2 找到desktop文件进行修改 cd /usr/share/applications sudo vim lce…

基于顺序表与链表的顺序查找(顺序表的折半查找)

内容 基于任意一个顺序表、链表&#xff0c;实现顺序查找算法&#xff1b;实现折半查找算法&#xff0c;并思考折半查找算法的适用场景&#xff1b; #代码实现 #include<iostream> #include <stdlib.h> using namespace std; #define MAX 20 #define datatype int…

JS手写题解析

手写Promise class MyPromise {constructor(executor) { // executor执行器this.status pending // 等待状态this.value null // 成功或失败的参数this.fulfilledCallbacks [] // 成功的函数队列this.rejectedCallbacks [] // 失败的函数队列const that thisfunction reso…

PCL 任意二维图像转点云

目录 一、概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 给定任意一张图片,通过代码操作将图片转成点云。图像中包含大量可用信息,其中必不可少的信息为像素坐标和像素值,将像…

基于Python+OpenCV的车牌识别停车场管理系统(PyQt界面)【含Python源码 MX_009期】

简介&#xff1a; 基于Python和OpenCV的车牌识别停车场管理系统是一种利用计算机视觉技术来自动识别停车场进出车辆的系统。该系统通过摄像头捕获车辆图像&#xff0c;并使用OpenCV库中的图像处理和模式识别技术来识别图像中的车牌号码。一旦车牌被成功识别&#xff0c;系统就会…

今年的就业环境不容乐观,你想好怎么应对了吗

今年的就业环境不容乐观&#xff0c;你想好怎么应对了吗 毕业生进入职场的历程往往充满挑战和未知&#xff0c;尤其是在当前经济环境下&#xff0c;失业问题愈发凸显。本文通过分享几位年轻人的真实经历&#xff0c;剖析大学生及职场人士面临的困境&#xff0c;并提供应对策略…

字符串及其应用

内容 编写程序实现字符串的基本运算&#xff1a; (1) 求串的长度、两串连接、串比较、子串匹配&#xff1b; (2) 用库函数直接实现上一步的字符申操作 完整代码 #include <iostream> #include <stdio.h> #include<string.h> using namespace std; #define M…

【乐吾乐2D可视化组态编辑器】下载离线部署包

下载离线部署包 乐吾乐2D可视化/大屏可视化支持导出为可直接部署运行的html文件。 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 1. 从“文件”菜单选择“下载离线部署包” 【提示】离线部署包是需要付费下载&#xff0c;首次体验&#xff0c;可以选择&…