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

使用Get包弹出所有路由后Widget状态失效的问题解决

问题原因

这个错误的核心是:Login组件在未完成挂载,或已被卸载的状态下,执行了onServerChanged函数。当远程登出触发Get.offAllNamed('/home')时,原有页面被销毁,而onServerChanged可能被异步操作(如定时器回调、Provider状态监听)触发,此时组件的State已失效,调用Provider.of(context)或setState()就会抛出该错误。

解决方案

1. 在onServerChanged开头增加组件存活判断

利用State类的mounted属性判断组件是否处于活跃状态,若已卸载则直接终止函数执行:

void onServerChanged({required String? value}) {
    // 关键:先判断组件是否仍挂载,避免无效操作
    if (!mounted) return;

    final globalsOneTimeRead = Provider.of<GlobalsProvider>(context, listen: false);

    selectedServer = value;

    if (value == null) {
      serverIPController.text = '';
      dbController.text = '';
      portController.text = '';
      setState(() {});
      return;
    }

    for (var element in serverList) {
      if (element['ServerName'] == selectedServer) {
        serverIPController.text = element['ServerIP'];
        dbController.text = element['DBName'];
        portController.text = element['PortNum'].toString();
      }
    }

    globalsOneTimeRead.updateServerName(serverName: selectedServer);

    setState(() {});
}

2. 清理组件销毁时的异步资源

如果onServerChanged由定时器、Stream订阅或Provider监听触发,必须在组件的dispose方法中取消这些资源,防止组件卸载后还触发回调:

@override
void dispose() {
    // 取消检查服务器状态的定时器(替换成你实际使用的定时器变量)
    authCheckTimer?.cancel();
    // 取消Provider的监听(如果有)
    Provider.of<GlobalsProvider>(context, listen: false).removeListener(_serverChangeListener);
    // 释放文本控制器资源
    serverIPController.dispose();
    dbController.dispose();
    portController.dispose();
    super.dispose();
}

3. 优化Login组件的初始化逻辑

确保onServerChanged只在组件完全挂载后执行,比如将初始化逻辑移到postFrameCallback中,避免在initState里直接触发可能导致context失效的操作:

@override
void initState() {
    super.initState();
    // 使用postFrameCallback确保组件已完成首次构建
    WidgetsBinding.instance.addPostFrameCallback((_) {
        // 在这里触发onServerChanged的初始化操作
        onServerChanged(value: initialServerValue);
    });
}

内容的提问来源于stack exchange,提问作者TheMortiestMorty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:12:07