【问题标题】:using permission handler at main flutter在主颤动中使用权限处理程序
【发布时间】:2023-03-04 15:27:01
【问题描述】:

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

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

错误:

发生了异常。 _CastError(用于空值的空检查运算符)

【问题讨论】:

    标签: flutter dart


    【解决方案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))));
      }
    }
    

    【讨论】:

      【解决方案2】:

      不知道你是用哪个包进行权限处理的,但是如果你使用this,你必须在isGranted之前加上request()

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

      或者,如果您只想获得许可状态而不要求它:

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

      【讨论】:

      • 我正在使用权限处理程序包,代码在应用程序的其他部分有效,但在主函数中无效
      • 我不确定您是否可以在实际运行应用程序之前请求权限。这个包使用 UI 元素来请求权限,此时在 main 中(例如在 runApp(MyApp()) 之前)这些可能还无法访问。
      • 可以尝试添加WidgetsFlutterBinding.ensureInitialized();在 main() 的第一行,但我真的认为它不会有帮助。
      • 我会尝试在代码后面的某个地方请求权限,例如使用有状态的应用程序小部件并在构建方法中添加权限处理。
      • 我希望系统在继续执行剩余代码之前等待文件夹权限,我使用异步等待,但它不起作用
      猜你喜欢
      • 2021-11-28
      • 2022-01-15
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2022-01-02
      • 2021-01-25
      相关资源
      最近更新 更多