Flutter中如何让组件获取函数执行后的更新变量值?
问题解决:Flutter中无法获取类实例更新后的变量值
问题根源
你当前的代码存在一个核心问题:每次调用FunctionCall()都会创建一个全新的类实例。
- 在
main函数里,你创建了一个FunctionCall实例并调用numberColumnFunction()更新了它的变量; - 但在
ColumnView中调用FunctionCall()时,又新建了一个完全独立的实例,这个新实例的变量都是默认初始值,自然拿不到之前更新后的数据。
解决方案
方案一:使用单例模式(全局唯一实例)
修改FunctionCall类,让整个应用中只存在一个该类的实例:
class FunctionCall { // 定义全局唯一的单例实例 static final FunctionCall _instance = FunctionCall._internal(); // 工厂构造函数,确保每次调用FunctionCall()都返回同一个实例 factory FunctionCall() => _instance; // 私有构造函数,禁止外部直接创建新实例 FunctionCall._internal(); int numberColumn = 3; int columnsPositioned = 5; var visibilityColumn = false; void numberColumnFunction(){ if (numberColumn == 3) { columnsPositioned = 8; visibilityColumn = true; } } }
后续代码无需修改,直接调用FunctionCall()即可获取同一个实例:
main函数里的调用保持不变,更新的是单例的变量;ColumnView里的调用也保持不变,此时获取的是已经更新后的单例变量值。
方案二:手动传递实例(局部共享)
如果不需要全局唯一实例,也可以将初始化好的实例直接传递给ColumnView:
- 修改
main函数,创建实例并传递给MyApp:
void main() async { final functionCall = FunctionCall(); await functionCall.numberColumnFunction(); runApp(MyApp(functionCall: functionCall)); }
- 修改
MyApp的构造函数,接收实例并传递给ColumnView:
class MyApp extends StatelessWidget { final FunctionCall functionCall; const MyApp({super.key, required this.functionCall}); @override Widget build(BuildContext context) { return MaterialApp( home: ColumnView(functionCall: functionCall), ); } }
- 修改
ColumnView,接收实例并使用:
class ColumnView extends StatelessWidget { final FunctionCall functionCall; const ColumnView({super.key, required this.functionCall}); @override Widget build(BuildContext context) { return // 你的Widget结构 // ... end: width / functionCall.columnsPositioned, visible: functionCall.visibilityColumn, // ... ; } }
方案选择
- 单例模式适合需要全局共享状态、且实例无需频繁销毁重建的简单场景;
- 手动传递实例更灵活,适合局部模块共享状态、或者需要多个独立实例的场景。
内容的提问来源于stack exchange,提问作者Verc
相关产品推荐
相关产品推荐

