Dartで一度に複数の非同期リクエストを実行する。適切な方法

inkwelll075

Flutterで同時実行を処理しようとしているので、サーバーから3つのget-requestがあり、それらから同時に値を取得する必要があります。各リクエストはモデルに解析されました。ここで、すべてのモデルを3つのget-requestを使用して1つのリストに結合し、これをListView.builderの最終リストで実行する方法を理解しようとしています。また、APIで述べたように、すべてのリクエストはネストされてIDに依存するため、3つのリストすべてを同時に解析する以外に、それらをフィルターで除外する必要があるため、私のような初心者にとっては非常に困難です。どうすればこれを解決できますか?

これは私のモデルです:

ScheduleVariants{
final int mrId;
final int mvId;

ScheduleVariants({this.mrId, this.mvId});
}

FlightCard{
final int mvId;
final int stId;

FlightCard({this.mrId, this.stId});
}

Stop{
final int stId;

Stop({this.stId})
}

Stopモデルから最終値を取得する必要があります。ご覧のとおり、すべてのモデルにネストされた構造があり、これを回避することはできません。

今、私は次のような同時呼び出しを行おうとしています:

class Dire extends StatefulWidget {
  final int mrId;
  final int mvId;
  final int stId;

  const Dire({Key key, this.mrId, this.mvId, this.stId}) : super(key: key);
  @override
  _DireState createState() => _DireState();
}

class _DireState extends State<Dire> {
  @override
  void initState() {
    fetchData();
    super.initState();
    stops.where((element) => element.stId == widget.stId).toList();
    card.where((element) => element.mvId == widget.mvId).toList();
    sheduler.where((element) => element.mrId == widget.mrId).toList();
  }

  List<ScheduleVariants> sheduler;
  List<FlightCard> card;
  List<Stop> stops;

  Future fetchData() async {
    String username = '';
    String password = '';
    String basicAuth =
        'Basic ' + base64Encode(utf8.encode('$username:$password'));
    print(basicAuth);
    final result = await Future.wait([
      http.get(
          Uri.parse(
              "http://mysecurelink/getMarshVariants.php?fmt=json"),
          headers: <String, String>{'authorization': basicAuth}),
      http.get(
          Uri.parse(
              "http://mysecurelink/getFlightCard.php?fmt=json&mv_id"),
          headers: <String, String>{'authorization': basicAuth}),
      http.get(
          Uri.parse(
              "http://mysecurelink/getStops.php?fmt=json"),
          headers: <String, String>{'authorization': basicAuth}),
    ]);
    setState(() {
      sheduler = json.decode(result[0].body) as List;
      card = json.decode(result[1].body) as List;
      stops = json.decode(result[2].body) as List;
    });
  }

  @override
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: FutureBuilder(
            future: fetchData(),
            builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
              if (snapshot.hasData) {
                return ListView.builder(
                    itemCount: stops.length,
                    itemBuilder: (context, index) {
                      return ListTile(
                        title: Text(stops[index].stTitle),
                      );
                    });
              } else {
      

      return CircularProgressIndicator();
          }
        }));

}}

メインタスクの最後に、IDでフィルタリングされた3つの並列リクエストを実行し、Stopsモデルからデータを取得します。どうすればそれを正しく行うことができますか?

私は初心者で、それを適切に行う方法がわかりません。誰かがこのタスクを理解するのを手伝ってくれたら本当にうれしいです。

wxker

十分な情報がないので、私はいくつかの仮定をするつもりです:

  1. Dire三つのクラスの組み合わせであるScheduleVariantsFlightCardそしてStopどこScheduleVariants.mvId == FlightCard.mvIdFlightCard.stId == Stop.stId
  2. 3つのAPIはすべて、応答としてリストを返します。
  3. すべてScheduleVariantsが一意でありmvId、すべてFlightCardsが一意でmvIdありstId、すべてStopsが一意であるstId

複数の非同期リクエストを実行する方法に問題はありません。Future.waitこの場合、先物のリストを取り込んで、応答のリストを返します。あなたが直面している問題は、3つのAPIリクエストからの応答をマージする方法がわからないということです。

あなたはまた、国家の使用と先物の使用を混同しているようです。少なくとも、提供したコードスニペットでは、初期化後に状態を変更する必要はないようです。つまり、状態を使用する必要はまったくありません。

Dire モデルクラスである必要があります。

class Dire {
  final ScheduleVariants scheduleVariant;
  final FlightCard flightCard;
  final Stop stop;

  Dire(this.scheduleVariant, this.flightCard, this.stop);
}

DiresAPIからを取得したいウィジェットでは、この関数をFutureBuilderで使用できます

  Future<List<Dire>> fetchData() async {
    String username = '';
    String password = '';
    String basicAuth =
        'Basic ' + base64Encode(utf8.encode('$username:$password'));
    print(basicAuth);
    final result = await Future.wait([
      http.get(
          Uri.parse(
              "http://mysecurelink/getMarshVariants.php?fmt=json"),
          headers: <String, String>{'authorization': basicAuth}),
      http.get(
          Uri.parse(
              "http://mysecurelink/getFlightCard.php?fmt=json&mv_id"),
          headers: <String, String>{'authorization': basicAuth}),
      http.get(
          Uri.parse(
              "http://mysecurelink/getStops.php?fmt=json"),
          headers: <String, String>{'authorization': basicAuth}),
    ]);
    flightCardMap = HashMap.fromIterable(json.decode(result[1].body), (fc) => fc["mvId"], (fc) => FlightCard(fc));
    stopMap = HashMap.fromIterable(json.decode(result[2].body), (s) => s["stId"], (s) => Stop(s));
    return json.decode(result[0].body).map((sv) => {
        flightCard = flightCardMap[sv["mvId"]];
        return Dire(ScheduleVariants(sv), flightCard, stopMap[flightCard["stId"]]);
    }).toList();
  }

免責事項:このコードスニペットで構文エラーをチェックしなかったため、いくつかある可能性がありますが、一般的な考え方はそこにあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

python Docker Image:複数のスクリプトを一度に実行する方法は?

複数のDBクエリを非同期で実行するCompletableFuture

ノードのPromisesで一度に複数のリクエストを並列非同期にする方法

PHPを使用してMysqlで一度に複数のクエリを実行する

Swift2.0で非同期リクエストを行う適切な方法

SSRSは一度に複数のクエリを実行しますか?

次々に開始する複数の非同期リクエストを実行する方法

一度に複数のIDでLinqToTwitterをクエリする方法は?

Jmeterで一度に複数のHTTPリクエストのHTTPリクエストパスを変更する方法

MySQL + Dapper QueryMultiple:複数のSELECTクエリを一度に実行する方法は?

さまざまなスキームで一度にクエリを実行する方法

複数のhttpリクエストが一度に発生しないようにする方法

AWSEKSで複数のコンテナでシェルスクリプトを一度に実行する方法

複数の行名を一度に適用する方法

複数の非同期APIリクエストを送信し、レスポンスを並行して処理する適切な方法は何ですか?

Cで一度に複数のビットをクリアする方法は?

一度だけ呼び出すと、なぜ複数のリクエストを送信するのですか?

一度に複数のリクエストを実行し、成功したらすぐに続行します

Unixで一度に複数のディレクトリで同じシェルスクリプトを実行する

一度に複数の非同期タスクを実行することはできません

複数のGUIDで一度にlinqフィルターを実行して、適切なsqlwhere句を生成する方法

一度に複数のnpmスクリプトを実行する

一度に複数のデータ フレームでスクリプトを実行する方法は?

一度に複数のスクリプトを実行することについての疑問

一度に複数のリストで実行するループを作成する

Cで複数のリダイレクトを適切に実行する方法

複数のマングースクエリを一度に実行し、expressjsを使用してjsonrespnoseを生成する方法

$wpdb->queryを使用してWordPressで一度に複数のクエリを実行する方法

複数のページ分割されたリクエストを一度に同時に実行し、Spring WebFlux で順番に収集する方法

TOP 一覧

  1. 1

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    Ansibleで複数行のシェルスクリプトを実行する方法

  4. 4

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  8. 8

    Chromeウェブアプリのウェブビューの高さの問題

  9. 9

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  10. 10

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  11. 11

    Reactでclsxを使用する方法

  12. 12

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  13. 13

    MLでのデータ前処理の背後にある直感

  14. 14

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

  15. 15

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  16. 16

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  17. 17

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  18. 18

    テキストフィールドの値に基づいて UIslider を移動します

  19. 19

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  20. 20

    PowerShellの分割ファイルへのヘッダーの追加

  21. 21

    ソートされた検索、ターゲット値未満の数をカウント

ホットタグ

アーカイブ