如何在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
相关产品推荐
相关产品推荐

