首页 > 编程问答 >Flutter 急迫单子与懒惰单子。加载和实例化

Flutter 急迫单子与懒惰单子。加载和实例化

时间:2024-06-09 23:56:42浏览次数:27  
标签:flutter dart singleton

我了解 eager lazy 单子之间的区别: eager 在首次加载时实例化,而 lazy 则在首次使用(方法调用)时实例化。

现在,为了充分理解两者的区别,我们应该知道加载是何时发生的。 根据 本文 ,加载发生在 启动 Dart 虚拟机 阶段。就在调用 main 方法的 创建和运行 Dart Isolate 阶段之前。

问题是:当我们从 main 调用单例时

void main() async{
  await MyService().execute();
  runApp( MainApp());
}
eager lazy 之间几乎没有区别。我说的对吗?

更新。 eager(early) 和 lazy singletons 的实现。

Eager :

class MyService{
  MyService._();
  static final _instance = MyService._();
  factory MyService() => _instance;
}

Laague

Lazy :

class MyService{
  MyService._();
  static MyService _instance;
  factory MyService() => _instance ??= MyService();
}
</pre


你说得对,在这种情况下,急切单例和惰性单例之间的区别很小。

让我们来分析一下原因:

  • Dart 虚拟机启动和隔离: 你所引用的文章中提到的启动过程确实在 main 函数执行之前发生。这意味着在 main 函数的第一行代码运行之前,Dart 虚拟机已经启动,并且隔离已经创建。

  • 急切单例: 急切单例在类加载时被实例化。由于 Dart 在执行任何代码之前会加载所有必要的类,因此在调用 main 函数之前,急切单例就已经被创建。

  • 惰性单例: 惰性单例在首次被使用时才被实例化。

在你的代码中,你在 main 函数中第一次使用 MyService 时,无论使用哪种单例实现, MyService 实例都会被创建。

急切单例: 实例在 main 函数执行之前就已经创建好了。

惰性单例: 实例会在 await MyService().execute() 这行代码执行时被创建。

区别: 两者之间的区别在于实例化的时间点相差很小。急切单例的实例化发生在 main 函数之前,而惰性单例的实例化发生在 main 函数的第一行代码执行时。

实际影响: 在这种情况下,这种微小的区别几乎不会对应用程序的性能或行为产生任何实际影响。

结论: 虽然你对急切和惰性单例之间区别的理解是正确的,但在你的代码示例中,这两种方法实际上没有太大区别。选择哪种方法取决于你的个人偏好和项目需求。

标签:flutter,dart,singleton
From: 78598408

相关文章

  • Mac环境如何使用Flutter Version Manager (fvm)
    Mac环境如何使用FlutterVersionManager(fvm)FlutterVersionManager(fvm)是一个Flutter版本管理工具,它允许开发者在本地安装并管理多个Flutter版本。使用fvm,您可以轻松切换不同版本的FlutterSDK,进行多项目开发而无需重复安装。本文将为您提供一个全面的指南,介......
  • Windows环境如何使用Flutter Version Manager (fvm)
    Windows环境如何使用FlutterVersionManager(fvm)FlutterVersionManager(fvm)是一个用于管理多个FlutterSDK版本的命令行工具,它允许开发者在不同项目之间轻松切换Flutter版本。这对于需要维护多个使用不同Flutter版本的项目的开发人员来说非常有用。本文将为......
  • flutter基础
    创建的flutter项目组件MaterialDesignFlutter中无状态组件(StatelessWidget)和有状态组件App结构内容点击查看代码import'package:flutter/material.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});......
  • flutter3-weos手机OS系统|Flutter3.22+Getx仿ios桌面管理OA应用
    原创自研flutter3.x+getx仿制ios手机桌面UI管理系统模板Flutter3-OS。flutter3-osx基于最新跨平台技术Flutter3.22+Dart3.4+GetX+fl_chart实战仿IOS风格手机os管理系统。全新自研flutter磁贴式栅格布局引擎、分屏式多页管理、自定义主题壁纸、卡片式桌面小部件、可拖拽式悬浮球菜......
  • 深入理解flutter的代码结构:组件
    import'package:flutter/material.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(title:'顶部......
  • static vs Singleton,静态类vs单例模式之争
    https://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?answertab=modifieddesc#tab-top单例模式可以用接口,Singletoncanimplementinterface可以通过单例类来实现接口,但不能通过类的静态方法或者在某些语言(如C#)中的静态类来......
  • Flutter 中的 LayoutBuilder 小部件:全面指南
    Flutter中的LayoutBuilder小部件:全面指南Flutter是一个功能丰富的UI框架,它允许开发者使用Dart语言来构建高性能、美观的跨平台应用。在Flutter的布局系统中,LayoutBuilder是一个强大的组件,它可以根据父容器的约束动态调整其子组件的布局。本文将为您提供一个全面......
  • Flutter 中的 PopupMenuTheme 小部件:全面指南
    Flutter中的PopupMenuTheme小部件:全面指南Flutter是一个由Google开发的跨平台UI框架,它允许开发者使用Dart语言构建美观、响应式的移动、Web和桌面应用。Flutter的Material组件库中包含了丰富的UI组件,其中PopupMenuButton是一个允许用户从下拉菜单中选择......
  • Flutter 中的 TableCell 小部件:全面指南
    Flutter中的TableCell小部件:全面指南Flutter是一个功能强大的UI框架,由Google开发,允许开发者使用Dart语言构建跨平台的移动、Web和桌面应用。在Flutter的丰富组件库中,TableCell是一个用于创建表格单元格的组件,它提供了灵活的方式来自定义表格的内容和布局。本......
  • Flutter 中的 ErrorWidget 小部件:全面指南
    Flutter中的ErrorWidget小部件:全面指南Flutter是一个由Google开发的跨平台UI框架,它允许开发者使用Dart语言构建高性能、美观的应用。在Flutter的丰富组件库中,ErrorWidget是一个特殊的组件,用于在渲染过程中捕获和显示错误。本文将为您提供一个全面的指南,介绍如......