Flutter权限判断异常求助:API返回false但_permission始终为true
问题原因与解决方案
核心问题是异步代码执行顺序错误:checkPermesssion()是异步函数,调用后会立刻继续执行后面的三元判断,此时API请求还没完成,_permission还是初始的true。等API返回结果更新_permission时,判断逻辑已经跑完了,所以看不到预期效果。
修复步骤
1. 让按钮点击回调等待权限检查完成
把onPressed改成异步函数,用await等待checkPermesssion()执行完毕,再进行权限判断:
child: ElevatedButton( onPressed: () async { // 添加async标记 await checkPermesssion(); // 等待权限检查完成后再执行后续逻辑 if (_permission) { Navigator.of(context).push( MaterialPageRoute(builder: (context) => page())); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('You don\'t have permission to access this page'), behavior: SnackBarBehavior.floating, margin: EdgeInsets.all(50), elevation: 30, action: SnackBarAction( label: 'Dismiss', disabledTextColor: Colors.white, textColor: Colors.yellow, onPressed: () { ScaffoldMessenger.of(context).hideCurrentSnackBar(); }, ), ), ); } }, )
2. 优化权限检查函数(可选)
可以让checkPermesssion()直接返回权限结果,减少对状态变量的依赖,逻辑更清晰,同时处理异常情况:
Future<bool> checkPermission() async { // 修正拼写错误,返回明确的bool类型 try { String api_token = await getToken(); final response = await http.post( Uri.parse(PermissionURL), headers: { 'Accept': 'application/json', 'Authorization': 'Bearer $api_token' }, ); final data = jsonDecode(response.body); // 处理可能的空值,默认返回false return data['permission'] ?? false; } catch (e) { // 捕获网络请求失败、解析错误等异常 print('权限检查失败: $e'); return false; } }
对应的按钮回调可以简化为:
onPressed: () async { final hasPermission = await checkPermission(); if (hasPermission) { Navigator.of(context).push(MaterialPageRoute(builder: (context) => page())); } else { // 显示无权限提示SnackBar ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('You don\'t have permission to access this page'), behavior: SnackBarBehavior.floating, margin: EdgeInsets.all(50), elevation: 30, action: SnackBarAction( label: 'Dismiss', disabledTextColor: Colors.white, textColor: Colors.yellow, onPressed: () { ScaffoldMessenger.of(context).hideCurrentSnackBar(); }, ), ), ); } },
3. 修正拼写错误
注意代码里的两处拼写问题:checkPermesssion多了一个s,permession应为permission,这些小错误可能增加后续维护成本。
内容的提问来源于stack exchange,提问作者xnor
相关产品推荐
相关产品推荐

