2016-08-13 58 views
2

我們假設在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

回答

1

構造函數可以僅返回類的一個實例是它的(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回報,否則等待未來先完成。