dart - flutter/Dart 异步不等待

标签 dart async-await flutter future

我正在构建我的第一个 Flutter 应用程序,但遇到了一些异步问题。

当我的应用程序执行时,我希望它请求权限并等待它们被授予。我的 main() 函数如下所示:

import 'permission_manager.dart' as Perm_Manager;

void main() async
{
  //Ensure valid permissions
  Perm_Manager.Permission_Manager pm = Perm_Manager.Permission_Manager();
  var res = await pm.get_permissions();
  print(res);

  return runApp(MyApp());
} 

Permission Manager 类的 get_permissions() 函数使用 Flutter Simple Permissions 包来检查和请求权限。

import 'package:simple_permissions/simple_permissions.dart';
import 'dart:io' as IO;
import 'dart:async';

class Permission_Manager {
  /* Get user permissions */

  Future<bool> get_permissions() async
  {
    //Android handler
    if (IO.Platform.isAndroid)
    {
        //Check for read permissions
        SimplePermissions.checkPermission(Permission.ReadExternalStorage).then((result)
        {
          //If granted
          if (result)
            return true;

          //Otherwise request them
          else
          {
            SimplePermissions.requestPermission(Permission.ReadExternalStorage)
            .then((result)
            {
              // Determine if they were granted
              if (result == PermissionStatus.authorized)
                return true;
              else
                IO.exit(0); //TODO - display a message
            });
          }
        });
    }

    else
      return true;
  }
}

当我运行应用程序时,它不会等待函数按预期完成,而是在 Future 更新之前打印“res”的值。

Launching lib\main.dart on Android SDK built for x86 in debug mode...
Built build\app\outputs\apk\debug\app-debug.apk.
I/SimplePermission(15066): Checking permission : android.permission.READ_EXTERNAL_STORAGE
I/flutter (15066): null
I/SimplePermission(15066): Requesting permission : android.permission.READ_EXTERNAL_STORAGE

Future 在函数中途返回一个值!有谁知道我做错了什么?

最佳答案

要等待某些东西,您必须在未来调用 await 关键字而不是 .then

final result = await future;
// do something

而不是

future.then((result) {
  // do something
});

如果你真的想要使用.then那么你可以等待生成的future:

await future.then((result) {
  // do something
});

只需确保在使用嵌套异步调用时在每个调用上都使用 async 关键字:

await future.then((result) async{
    // do something
    await future.then((result_2) {
       // do something else
    });
});

关于dart - flutter/Dart 异步不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53632137/

相关文章:

c# - 使用 async/await 设置 Thread.CurrentPrincipal

dart - 如何在 Flutter 中更改键盘上的文本输入操作按钮(返回/回车键)?

flutter - 如何在Android Studio中不运行模拟器/模拟器的情况下运行Dart程序

dart - 忽略转义的多行引号

android - Flutter中RelativeLayout的等价物

flutter - 如何在 Dart 列表中重复重复项?

dart - 在 Dartium 中调试 Dart - 断点关键字?

c# - 使方法异步

flutter - 类型 'String' 不是类型 'File' 的子类型 'value'

javascript - 如何在 JavaScript 中使用异步生成器?