Как правильно запрашивать разрешения во время выполнения во Flutter? - PullRequest
0 голосов
/ 12 июля 2020

Моя цель - правильно запрашивать разрешения во время выполнения во Flutter.

Прямо сейчас я столкнулся с проблемой # 1 , значительная задержка 3 to 6 seconds перед инициализацией приложения и проблема # 2 , простой метод request() вызывает исключение.

Я ожидал, что приложение не пропускает кадры и не вызывает исключение.

проблема # 1

I/Choreographer(19813): Skipped 35 frames!  The application may be doing too much work on its main thread

lib / main.dart

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

// void main() {
//  runApp(MyApp());
//}
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PermissionWidget(),
    );
  }

}

class PermissionWidget extends StatefulWidget {
  @override
  _PermissionState createState() => _PermissionState();
}

class _PermissionState extends State<PermissionWidget> {

  @override
  void initState() {
    super.initState();
    
    _listenForPermissionStatus();
  }
    
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Text('test'),
    );
  }
    
  void _listenForPermissionStatus() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.microphone,
      Permission.storage,
    ].request();
  }
}

проблема # 2

Exception has occurred.
PlatformException (PlatformException(PermissionHandler.PermissionManager, A request for permissions is already running, please wait for it to finish before doing another request (note that you can request multiple permissions at the same time)., null))

перед редактированием: lib / main.dart

...
  ...
  void _listenForPermissionStatus() {
    Permission.microphone.request();
    Permission.storage.request();
  }
}

редактировать # 1: lib / main.dart

...
  ...
  void _listenForPermissionStatus() async {
    await [
      Permission.microphone,
      Permission.storage,
    ].request();
  }
}

Оказывается, исключение приостановило метод, пожалуйста поправьте меня, если я ошибаюсь. Я использую async и await, чтобы исправить это, но я не уверен, правильно ли я делаю это, поскольку учебник использует Map<Permission, PermissionStatus>

...