You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:06:24