代码之家  ›  专栏  ›  技术社区  ›  Wazza

用异步变量初始化类

  •  0
  • Wazza  · 技术社区  · 8 年前

    如何用异步变量初始化一个类,以便在使用该类之前对其进行设置?我的班级正在给一个 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");
      }
    }
    

    有更好的方法吗?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Richard Heap    8 年前

    您可能希望有异步工厂构造函数,但是它们 aren't allowed .

    所以一个解决方案是 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);
    }
    

    可以将参数传递到 getInstance 从而根据需要进入构造器。请用以下方式调用上述内容:

    Storage s = await Storage.getInstance();