首页 > 其他分享 >Flutter Completer 的妙用

Flutter Completer 的妙用

时间:2023-02-03 10:45:11浏览次数:34  
标签:妙用 doSomething 初始化 Completer print 执行 completer Flutter

适用场景:
1.例如在app启动的时候,需要初始化数据(例如从服务端拉取数据),初始化的时间比较久,或者受限于网络,时间不可控,
后面用户点击了某个操作,这个操作依赖于初始化,就需要等待初始化完成,就可用使用Completer类来实现在这种效果。
2.将异步监听的方式,改成await的方式,更符合dart的使用方式。

Completer的方法就以下几个:
  completer.future;
  completer.isCompleted;
  completer.complete();
  completer.completeError(error);

  一般用法:

import 'dart:async';

void main() {
  init();
  // 例如用户点击触发的时候,执行doSomething方法,
  // doSomething方法内部需要等待init方法执行完成才可用继续完成用户的操作。
  doSomething();
}

Completer<void> completer = Completer<void>();

Future<void> init() async {
  print("正在执行初始化的操作");
  await Future.delayed(const Duration(seconds: 2));
  completer.complete();
  print("初始化完成");
}

Future<void> doSomething() async {
  print("执行其他操作");
  await completer.future;
  print("执行其他操作完成");
}

  执行结果:

正在执行初始化的操作
执行其他操作
// 等待2秒后
初始化完成
执行其他操作完成

  也可抛出异常:

import 'dart:async';

void main() {
  init();
  // 例如用户点击触发的时候,执行doSomething方法,
  // doSomething方法内部需要等待init方法执行完成才可用继续完成用户的操作。
  doSomething();
}

Completer<void> completer = Completer<void>();

Future<void> init() async {
  print("正在执行初始化的操作");
  await Future.delayed(const Duration(seconds: 2));
  // completer.complete();
  completer.completeError("初始化失败");
  print("初始化完成");
}

Future<void> doSomething() async {
  print("执行其他操作");
  try {
    await completer.future;
  } catch (e) {
    print(e);
  }
  print("执行其他操作完成");
}

  执行结果:

正在执行初始化的操作
执行其他操作
// 等待2秒 初始化完成 初始化失败 执行其他操作完成

  针对适用场景2的demo:

import 'dart:async';

void main() {
  doSomething();
}

typedef OnSuccess<T> = void Function(T response);

typedef OnFailed = void Function(int errCode, String errMsg);

Future<void> doSomething() async {
  Completer<String> completer = Completer<String>();
  // 例如网络请求异步,或者是其他使用监听器来实现异步的,都可用改成async的方式
  requestSomething(
    (response) => {completer.complete(response)},
    (errCode, errMsg) => {
      completer.completeError({"errCode": errCode, "errMsg": errMsg})
    },
  );
  try {
    String response = await completer.future;
    // 成功
    print("执行响应:$response");
  } catch (e) {
    print(e);
  }
}

void requestSomething(OnSuccess<String> onSuccess, OnFailed onFailed) {
  // Future.delayed(const Duration(seconds: 2))
  //     .then((value) => {onSuccess("执行成功")});
  Future.delayed(const Duration(seconds: 2))
      .then((value) => {onFailed(90001, "执行失败")});
}

 

标签:妙用,doSomething,初始化,Completer,print,执行,completer,Flutter
From: https://www.cnblogs.com/hbolin/p/17087021.html

相关文章

  • Flutter入门资料推荐
    前言群里很多入门小白不知道如何入门Flutter,水一篇文章简单介绍下本人学习过程中一些参考资料,方便Flutter小白少走弯路。非权威,推荐只针对本人经验来的说,大佬们不喜......
  • flutter:安装使用自定义的字体(flutter 3.7.0)
    一,在flutter项目中引入字体文件在项目中创建存放字体的文件夹fonts,并把要使用到的字体文件复制到此文件夹下:如图:说明:刘宏缔的架构森林是一个专注架构的博客,地址:htt......
  • 迭代器的妙用
    例如:实现数列求和#include<bits/stdc++.h>usingnamespacestd;structnode{ intval; node&operator=(intv){ val+=v; return*this; }};structiter{......
  • flutter:安装使用第三方库:以dio为例(flutter 3.7.0 / dio 4.0.6)
    一,dio库的地址:国外:https://pub.dev/packages/dio国内:https://pub.flutter-io.cn/packages/dio如图:可以看到最新版本是4.0.6说明:刘宏缔的架构森林是一个......
  • flutter:新创建一个项目(flutter 3.7.0)
    一,创建flutter项目启动androidstuido点击NewFlutterProject打开界面如图:此处:如果flutterSDK的目录没问题,点击Next按钮如图:此处设置Projectname(项目名称)......
  • 使用VS Code创建第一个Flutter工程
    一、前言你可以使用任意文本编辑器,再结合命令行工具来开发Flutter应用。然而,我们推荐使用本文接下来介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、......
  • Flutter 3.7 新特性:介绍后台isolate通道
    Flutter3.7发布,本人对其中后台isolate通道比较感兴趣,迫不及待翻译了下AaronClarke文章,第一次翻译,有不足地方欢迎各位大佬们评论区指正,我将持续更新到本文,谢谢。原文......
  • Flutter:升级用到的第三方库(Flutter 3.7.0)
    一,查看当前项目webview_flutter的版本:我们需要对webview_flutter这个第三方库升级说明:pubspec.yaml  声明依赖哪些包的配置文件,可以手动配置pubspec.lock  统一......
  • flutter Listview physics常见子类
    ListView的physics是ScrollPhysics类:其常见子类有BouncingScrollPhysics :允许滚动超出边界,但之后内容会反弹回来。ClampingScrollPhysics :防止滚动超出边界,夹住 。......
  • flutter Container 在Expanded会占用尽可能大的区域
    布局特点一、Container在不设置宽高的情况下,它的size取决于如果设置了child,那么它会尽可能小,在没有设置constraints情况下,相当于child的大小。如果没有设置child,那么它......