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

Flutter异步函数执行前组件构建导致登录状态判断异常

解决办法

你的问题根源有两个:一是异步获取数据后没触发UI刷新,二是在构造函数里调用异步方法不符合Flutter的最佳实践。按下面的方式修改即可解决:

  1. 将获取clientId的逻辑移到initState中——这是State组件初始化的标准位置。由于initState不能标记为async,我们在其内部调用异步方法,拿到数据后通过setState更新状态,触发UI重建。
  2. 可选:添加加载状态,避免用户一开始看到空白页面,提升体验。

修改后的代码示例:

class _ScheduleStateService extends State<ScheduleService> {
  int clientId = 0;
  bool _isLoading = true; // 新增加载状态

  @override
  void initState() {
    super.initState();
    _userAuthenticated(); // 在initState中启动异步操作
  }

  Future<void> _userAuthenticated() async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    setState(() {
      clientId = pref.getInt("cliente_id") ?? 0;
      _isLoading = false; // 标记加载完成
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_isLoading) {
      // 加载过程中显示加载组件
      return const Scaffold(
        body: Center(child: CircularProgressIndicator()),
      );
    }

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: const Text('Agendamento'),
      ),
      body: Form(
        key: _formKey,
        child: ListView(
          children: [
            // 用条件渲染替代三目运算符,代码更简洁
            if (clientId != 0)
              Padding(
                padding: const EdgeInsets.all(8),
                child: Card(
                  elevation: 4,
                  child: SizedBox(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        keyboardType: TextInputType.text,
                        controller: enderecoController,
                        decoration: const InputDecoration(
                            labelText: 'Endereço',
                            enabled: false,
                            border: InputBorder.none,
                            labelStyle: TextStyle(
                                color: Color(0xFFE84505),
                                fontSize: 18,
                                fontWeight: FontWeight.w600)),
                      ),
                    ),
                  ),
                ),
              ),
          ],
        ),
      ),
    );
  }
}

关键说明:

  • initState是State组件初始化的安全时机,在这里启动异步操作比构造函数更可靠。
  • setState是Flutter更新UI的核心机制,修改状态后必须调用它,框架才会重新执行build方法更新界面。
  • 新增的_isLoading状态可以避免用户在数据加载完成前看到空白,优化交互体验。

内容的提问来源于stack exchange,提问作者João Victor Minervino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:10:33