2016-08-13 22 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リターンを完了しましたそれ以外の場合は、最初に完了するために、将来のを待ちます。

関連する問題