如何在不阻止访问的情况下处理 Dart 对象中的异步初始化?

问题描述 投票:0回答:1

我正在使用一个 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

在构建方法中创建的
flutter dart
1个回答
0
投票

使用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
      }
    },
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.