Flutter - Asynchronous programming


final / const

finalおよびconstは、定数を作成する制御者である.2つのインジケータの違いは、実行時に初期化するか、Compile-timeで初期化するかによって異なります.constはCompile-timeで初期化され、C言語を例にとると、コンパイル中に設定されたconst定数は、プログラム内でコンパイラをすべて特定の値に変更しておきます.
ただしfinalはrun-timeで決定しなければならない定数に使用される.すなわち,直接値を割り当てずにプログラム自体を実行してこそ,値を割り当てることができる.例えば、DateTime.now()は、現在の時刻を返す方法であり、実行時の時刻を返す.したがって、Compileでは値が分からず初期化できないため、finalインジケータを使用する必要があります.

Isolates and Event loops

Isolatedartは、内部で単一スレッドプログラムを実行する構造である.必要に応じてさらに(Isolate.spawn())を作成することができ、各Isolateは孤立した空間である.各Isolateには独立したメモリ領域とイベントループがあり、古いイベント順にタスクを実行します.Isolate間ではメモリが共有されないため、共有リソースの使用の問題を考慮する必要はなく、メッセージによって通信され、受信メッセージのIsolateは、その固有のイベントループ空間でこれらの問題を処理する.
Isolate内部のEvent loopは本質的に非同期プログラミングを可能にするツールである.Future, Stream, async/awaitのような制御者もEvent loopで操作する.

Future

Futureは、非同期プログラミングの結果を示し、後で作業の成果を受け取ることを約束します.
結果物の有無によって3つの状態に分けられる.
  • 未完了(Uncompleted):将来のオブジェクトを作成した後、リクエストのステータス
  • 完了(完了):要求されたタスクが完了しました
    2.1データ:正常データが戻る
    2.2エラー:操作処理中に問題が発生したため、エラーを返す
  • Future通常は箱で表され、箱が開いたときに中のものをマークするにはどうすればいいですか.このため、ツールはasync/awaitです.

    async/await


    非同期の実行順序を決定するルールは次のとおりです.
  • 非同期関数を定義するために、asyncを関数体に指定します.
  • awaitキーワードはasyncと命名された非同期関数でのみ機能します.
  • 次のコードを見てください.
    // This example shows how *not* to write asynchronous Dart code.
    
    String createOrderMessage() {
      var order = fetchUserOrder();
      return 'Your order is: $order';
    }
    
    Future<String> fetchUserOrder() =>
        // Imagine that this function is more complex and slow.
        Future.delayed(
          const Duration(seconds: 2),
          () => 'Large Latte',
        );
    
    void main() {
      print(createOrderMessage());
    }
    // Your order is: Instance of '_Future<String>'
    同期実行手順を見ると、以下のようになります.
  • main()文はcreateOrder Message()関数を実行します.
  • 内部fetchUserOrder()を実行します.
  • fetchUserOrder()は非同期関数なので、次の行を実行して印刷文を返します.
  • このプロセスでは、fetchUserOrder()関数からデータをインポートするプロセスに2秒の遅延があるため、実行される戻り出力文は、正しいデータを持たない完全なオブジェクトを出力します.
    このプロシージャを回避するには、async/awaitControllerツールを使用して非同期プロシージャの情報を追加します.
    
    Future<String> createOrderMessage() async{
      var order = await fetchUserOrder();
      return 'Your order is: $order';
    }
    
    Future<String> fetchUserOrder() =>
        Future.delayed(
          const Duration(seconds: 2),
          () => 'Large Latte',
        );
    
    void main() async{
      print(await createOrderMessage());
    }
    // Your order is: Instance of Large Latte

    ソース

  • 朝食帳