【发布时间】:2023-03-04 15:27:01
【问题描述】:
我试图在 main 内的应用程序开始时获得用户许可,但我得到了异常。
void main() async {
final permission = Permission.manageExternalStorage.request();
if (await permission.isGranted){
}
错误:
发生了异常。 _CastError(用于空值的空检查运算符)
【问题讨论】:
我试图在 main 内的应用程序开始时获得用户许可,但我得到了异常。
void main() async {
final permission = Permission.manageExternalStorage.request();
if (await permission.isGranted){
}
错误:
发生了异常。 _CastError(用于空值的空检查运算符)
【问题讨论】:
查看下面的代码,我认为它可以解决您的问题,我对其进行了测试并为我工作。它没有在 main() 中获取权限,而是使用有状态小部件 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))));
}
}
【讨论】:
不知道你是用哪个包进行权限处理的,但是如果你使用this,你必须在isGranted之前加上request():
if (await Permission.manageExternalStorage.request().isGranted) {
}
或者,如果您只想获得许可状态而不要求它:
var status = await Permission.manageExternalStorage.status;
if (status.isDenied) {
}
【讨论】: