Флаттер / Дарт Асинк не ждет - PullRequest
0 голосов
/ 05 декабря 2018

Я создаю свое первое приложение 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());
} 

Функция get_permissions () класса Permission Manager использует пакет 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;
  }
}

КогдаЯ запускаю приложение, оно не ждет, пока функция завершит работу, как предполагалось, и печатает значение «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 возвращает значение в середине функции!Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Получил это работает.Кажется, проблема решена с помощью Completer:

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

class Permission_Manager {
  /* Get user permissions */

  final Completer c = new Completer();

  Future get_permissions() async
  {

    //Android handler
    if (IO.Platform.isAndroid)
    {
        //Check for read permissions
        SimplePermissions.checkPermission(Permission.ReadExternalStorage).then((result)
        {
          //If granted
          if (result)
          {
            c.complete(true);
          }
          //Otherwise request them
          else
          {
            SimplePermissions.requestPermission(Permission.ReadExternalStorage).then((result)
            {
              // Determine if they were granted
              if (result == PermissionStatus.authorized)
              {
                c.complete(true);
              }
              else
              {
                IO.exit(0); //TODO - display a message
              }
            });
          }
        });
    }

    else
    {
      c.complete(true);
    }

    return c.future;
  }

}
0 голосов
/ 05 декабря 2018

Чтобы чего-то ждать, вы должны вызвать ключевое слово await в будущем вместо .then

final result = await future;
// do something

вместо

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

Если вы действительно хотите использовать .then, тогда вы можете ожидать сгенерированное будущее:

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

Просто убедитесь, что при использовании вложенных асинхронных вызовов ключевое слово async используется для каждого:

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