我正在使用一个 Dart 类,该类需要异步操作来初始化其属性。但是,由于我无法在构造函数中使用await,因此该对象在访问时可能无法完全初始化。
这是我的代码的简化版本:
class MyObject {
late String data;
MyObject() {
// Cannot await here
initialize();
}
Future<void> initialize() async {
data = await fetchData();
// More initialization logic...
}
Future<String> fetchData() async {
// Simulate an async operation
await Future.delayed(Duration(seconds: 2));
return 'Fetched Data';
}
}
void build(BuildContext context) {
MyObject obj = Provider.of<MyObject>(context);
// Accessing data immediately after creation
print(obj.data); // This may throw an error if 'data' isn't initialized yet
}
问题: build方法在创建对象后立即访问
obj.data
,这可能会导致访问未初始化的数据,因为initialize方法是异步运行的。
问题: 处理这种情况的最佳方法是什么?如何确保对象在访问之前已完全初始化,而不阻塞对象的构造?
我尝试过的:我想我不能在这里使用工厂构造函数,因为
MyObject
是使用 ChangeNotifierProvider
在构建方法中创建的
使用changenotifier扩展类
MyObject extends ChangeNotifier{}
添加新变量调用加载
bool loading = true;
获取数据后make false
Future<void> initialize() async {
data = await fetchData();
loading = false;
notifyListeners();
}
那么用户界面应该是这样的
加载为真,则显示圆形进度指示器,否则显示数据
Widget build(BuildContext context) {
return Consumer<MyObject>(
builder: (context, myObject, child) {
if (myObject.isLoading) {
return CircularProgressIndicator(); // Show loading state
} else {
return Text(myObject.data ?? 'No Data'); // Show data once loaded
}
},
);
}