从Dart中的组件构造函数调用异步方法

问题描述:

我们假设在Dart中初始化MyComponent需要向服务器发送HttpRequest。是否有可能同步构造一个对象,并推迟一个“真正的”初始化直到响应返回?从Dart中的组件构造函数调用异步方法

在下面的示例中,_init()函数直到打印完“done”才会被调用。有没有可能解决这个问题?

import 'dart:async'; 
import 'dart:io'; 

class MyComponent{ 
    MyComponent() { 
    _init(); 
    } 

    Future _init() async { 
    print("init"); 
    } 
} 

void main() { 
    var c = new MyComponent(); 
    sleep(const Duration(seconds: 1)); 
    print("done"); 
} 

输出

done 
init 
+0

你可以使用静态异步方法吗? – Ganymede

构造函数可以仅返回类的一个实例是它的(MyComponent)的构造函数。您的要求将需要一个构造函数返回不支持的Future<MyComponent>

要么你需要做的是需要通过你的类的用户喜欢被称为一个明确的初始化方法:

class MyComponent{ 
    MyComponent(); 

    Future init() async { 
    print("init"); 
    } 
} 

void main() async { 
    var c = new MyComponent(); 
    await c.init(); 
    print("done"); 
} 

,或者你在consturctor开始初始化,并允许组件等待的用户初始化完成。

class MyComponent{ 
    Future _doneFuture; 

    MyComponent() { 
    _doneFuture = _init(); 
    } 

    Future _init() async { 
    print("init"); 
    } 

    Future get initializationDone => _doneFuture 
} 

void main() async { 
    var c = new MyComponent(); 
    await c.initializationDone; 
    print("done"); 
} 

_doneFuture已经立即完成await c.initializationDone回报,否则等待未来先完成。