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已经初始化,可以避免潜在的错误和不稳定性,确保应用的正常运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog,点击关注哦💕 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点,使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一,是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

C#.Net筑基-类型系统①基础

C#.Net的BCL提供了丰富的类型,最基础的是值类型、引用类型,而他们的共同(隐私)祖先是 System.Object(万物之源),所以任何类型都可以转换为Object。 01、数据类型汇总 C#.NET 类型结构总结如下图…

项目采购管理

目录 1.概述 2.三个子过程 2.1.规划采购管理 2.2.实施采购 2.3.控制采购 2.4.归属过程组 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 需求识别和分析 3.2.2. 制定采购计划 3.2.3. 发布采购请求 3.2.4. 供应商评估与选择 3.2.5. 合同签订 3.2.6. 采购…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

The Google File System 论文阅读

2003年USENIX,出自谷歌,开启分布式大数据时代的三篇论文之一 总体设计 假设 硬件损坏是常态,而非意外。例如磁盘损坏,断电,断网。所以持续的监控,错误诊断,错误恢复要纳入系统设计之中文件很…

【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux

前言 在私域知识问答和企业知识工程领域,结合Retrieval-Augmented Generation(RAG)模型和大型语言模型(LLM)已成为主流方法。然而,企业中存在着大量的PDF文件,PDF解析的低准确性显著影响了基于…

open-amv开发环境搭建

open-amv是基于rv1103主控芯片的视觉开发板子 1.板子使用 板子使用type c作为调试口,同时供电,请在电脑上下载adb,当板子通过tpye c与电脑连接后,执行命令adb shell就会进入到板子的linux系统命令行。 2.编译环境 2.1 搭建doc…

ipad协议已更新

mmtls 24算法,by golang 其他/v1/other POST/v1/other/GetPeopleNearby 查看附近的人 POST/v1/other/GetQrCode 获取二维码 同步消息/v1/ws GET/v1/ws/GetSyncMsg 同步消息,ws协议 消息/v1/message POST/v1/message/AddMessageMgr 添加要发送…

什么是无杂散动态范围 (SFDR)?为什么 SFDR 很重要?

有多种不同的规格可用于表征电路线性度。SFDR 指标是一种常用的规范。该指标定义为所需信号幅度与感兴趣带宽内杂散的比率(图 1)。 图 1. 显示 SFDR 指标的图表。 对于 ADC,SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。作为一个…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好,我是老三,最近读了《海绵阅读法:如何吸收一本书的精华》,第一次阅读教如何阅读的书,整理一番读书笔记,分享给大家。 读书动机 我前一阵子写了篇文章,2024Q1,盘点我看过的54本…

[Java基本语法] 逻辑控制与方法

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀线程与…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代,创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画,却又苦于找不到合适的画师或高昂的费用而望而却步?现在,这一切都将成为现实! 进入首助编辑高手的AI魔法智绘图板块…

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念,反而不是其本身的技术。技术上今天可以有Spring春天,明天就可以有Autumn秋天。 核心理念有多重要?就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B,这是一个具有划时代意义的模型,它使用了高达 98% 的合成数据进行训练,并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型,支持 4K 上下文窗口、50 …

回答网友的一个Delphi问题

网友想在grid 中 加一个水印,俺就给他写了个例子。先靠效果: 这个例子 包含下面几步: 1、创建背景 dg_bmp:Tbitmap.Create; w: Image1.Picture.Bitmap.width; h: Image1.Picture.Bitmap.height; dg_bmp.width: w*2; dg_bmp.height: …

从入门到高手的99个python案例(2)

51. 列表和数组比较 - 列表通用,NumPy数组高效。 import numpy as np normal_list [1, 2, 3] np_array np.array([1, 2, 3]) print(np_array.shape) # 输出 (3,), 数组有形状信息 52. Python的内置模块datetime - 处理日期和时间。 from datetime import…

数据库MySQL——从0到1入门教程

Q:为什么需要MySQL? A:网络服务中,我们需要存储、管理大量的数据,并确保数据的安全、实现增删改查操作的高效,因此需要一个系统用来专门管理数据,以实现上述的高性能要求,数据库管理系统应需而生 八股如下…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战

前言 我们在做自动化测试的时候,通常会把配置信息和测试数据存储到特定的文件中,以实现数据和脚本的分离,从而提高代码的易读性和可维护性,便于后期优化。 而配置文件的形式更是多种多样,比如:ini、yaml、…

pdf structuredClone is not defined 解决

问题 部分手机系统的浏览器 pdf v2版本会出现 structuredclone is not defined 的报错,这是因为浏览器过低 解决 查看structuredClone的浏览器兼容性 structuredClone api 文档 polyfill 网站下方有个 polyfill的网址入口 可以解决低版本的兼容问题 相应网址…