使用异步变量初始化类

Waz*_*zza 2 dart

如何使用异步变量初始化类,以便在使用该类之前设置它们?我的类当前只是调用一个async init函数,但我必须单独调用该函数才能等待它完成:

class Storage {

  String imageDirectory;
  String jsonDirectory;
  SharedPreferences instance;
  String uuid;

  init() async {
    imageDirectory = '${(await getApplicationDocumentsDirectory()).path}/image_cache/';
    jsonDirectory = '${(await getApplicationDocumentsDirectory()).path}/json_cache/';
    instance = await SharedPreferences.getInstance();
    uuid = instance.getString("UUID");
  }
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Ric*_*eap 6

您可能希望拥有异步工厂构造函数,但它们是不允许的

因此,一种解决方案是static getInstance(),例如:

class Storage {
  static Future<Storage> getInstance() async {
    String docsFolder = (await getApplicationDocumentsDirectory()).path;
    return new Storage(
        docsFolder + '/image_cache/',
        docsFolder + '/json_cache/',
        (await SharedPreferences.getInstance()).getString('UUID'));
  }

  String imageDirectory;
  String jsonDirectory;
  String uuid;

  Storage(this.imageDirectory, this.jsonDirectory, this.uuid);
}
Run Code Online (Sandbox Code Playgroud)

您可以getInstance根据需要将参数传递到构造函数中。使用以下命令调用上面的内容:

Storage s = await Storage.getInstance();
Run Code Online (Sandbox Code Playgroud)