在主颤振中使用权限处理程序

时间:2021-07-25 06:11:04

标签: flutter dart

我试图在主应用程序开始时获得用户许可,但我得到了异常。

void main() async {
    final permission = Permission.manageExternalStorage.request();
    if (await permission.isGranted){
    }

错误:

<块引用>

发生异常。 _CastError(对空值使用空检查运算符)

2 个答案:

答案 0 :(得分:1)

查看下面的代码,我认为它可以解决您的问题,我对其进行了测试并为我工作。它没有在 ma​​in() 中获取权限,而是使用有状态小部件 MyApp,尝试在 initState() 中获取权限,使用异步函数 _getPermission() 等待用户的响应并使用 setState() 更新 _permission 成员中的权限授予状态。

build 方法中,您可以决定在授予与否的情况下您的应用应该做什么。在这个例子中,我只根据权限输出一条消息。例如,您可以在获得授权后返回 MaterialApp,如果没有,则返回一条警告消息,任何您喜欢的内容。

您可能已经意识到这一点,但还有一件事:如果用户永久拒绝许可,此解决方案将不会再次提示,因此您必须处理这种情况,如果您的应用程序没有这个就无法运行,您可以向用户提供进入设置并在那里启用它。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _permission = false;

  void _getPermission() async {
    final grant = await Permission.camera.request().isGranted;
    setState(() {
      _permission = grant;
    });
  }

  @override
  void initState() {
    _getPermission();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    String message =
        _permission ? 'Permission granted' : 'Permission not granted';

    return MaterialApp(home: Scaffold(body: Center(child: Text(message))));
  }
}

答案 1 :(得分:0)

我不知道你用哪个包来处理权限,但是如果你使用this,你必须在isGranted之前添加request() :

if (await Permission.manageExternalStorage.request().isGranted) {
}

或者,如果您只想获得许可状态而无需请求:

var status = await Permission.manageExternalStorage.status;
if (status.isDenied) {
}