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

如何在Flutter/Dart中实现全局变量?

嘿,这个场景太常见了!针对单个全局变量的需求,有几个简单实用的方案,根据你的需求选就行:

方案1:直接定义顶级全局变量(最简单,无响应式)

如果你的变量不需要触发UI更新,只是单纯需要在各个页面访问,直接把它放在main.dart的main函数外面作为顶级变量就好:

// main.dart
// 直接定义在main函数外,全局可访问
String appGlobalVariable = "初始值";

void main() {
  runApp(const MyApp());
}

// 其他任意Screen里直接调用
class SettingsScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(appGlobalVariable),
        ElevatedButton(
          onPressed: () {
            // 直接修改全局变量
            appGlobalVariable = "修改后的值";
          },
          child: const Text("修改变量"),
        )
      ],
    );
  }
}

⚠️ 注意:这种方式的缺点是变量变化时不会自动触发UI重建,如果你的页面需要跟着变量更新,这个方案就不适用了。

方案2:用ValueNotifier实现响应式全局变量(轻量且支持UI更新)

如果需要变量变化时自动更新UI,ValueNotifier是最适合单个变量的轻量方案,不需要引入复杂的状态管理库:

// main.dart
// 定义一个ValueNotifier包裹你的变量
final globalUserScore = ValueNotifier<int>(0);

void main() {
  runApp(const MyApp());
}

// 在其他Screen中使用,UI会自动响应变化
class ScoreScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder<int>(
      valueListenable: globalUserScore,
      builder: (context, currentScore, child) {
        return Column(
          children: [
            Text("当前得分:$currentScore"),
            ElevatedButton(
              onPressed: () {
                // 通过value属性修改值,会自动通知UI更新
                globalUserScore.value++;
              },
              child: const Text("加分"),
            )
          ],
        );
      },
    );
  }
}

这个方案既保持了全局访问的便利性,又能让UI自动跟随变量变化更新,对于单个变量来说是性价比最高的选择。

额外提示:避免滥用全局变量

虽然全局变量用起来方便,但如果后续变量增多或者逻辑变复杂,建议考虑使用Provider、Riverpod这类状态管理库来维护状态,让代码更易维护。不过就单个变量的需求来说,上面两个方案完全够用了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:42:44