首页 > 解决方案 > 在 dart 中使用 async/wait 不等待 http 包

问题描述

我已经阅读了与该主题相关的先前发布的问题,但无法理解发生了什么。我想我已经完成了这个官方 dart/flutter 视频中解释的完全相同的过程 - https://www.youtube.com/watch?v=SmTCmDMi4BY

我想做的很简单。我想进行 API 调用,需要等到我得到响应。但我看不到让它工作。也许我对异步/等待的理解是错误的。如果我检查控制台输出,我会得到这样的

Staring the Program
Ending the Program
Got the questions list
[Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question', Instance of 'Question']

有人可以帮我弄这个吗。

import 'package:http/http.dart' as http;
import 'dart:convert';

void main() {
  print('Staring the Program');
  getQuestions();
  print('Ending the Program');
}

void getQuestions() async {
  QuizModel qm = QuizModel();
  List<Question> questionsList = await qm.getQuestions();
  print('Got the questions list');
  print(questionsList);
}

class Question {
  String question;
  bool answer;
  Question({this.question, this.answer});
}

class QuizModel {
  var quizData;

  Future<List<Question>> getQuestions() async {
    NetworkHelper networkHelper =
        NetworkHelper('https://opentdb.com/api.php?amount=10&type=boolean');
    quizData = await networkHelper.getData();
    final List<Question> questionsList = [];
    for (final question in quizData['results']) {
      bool answer;
      question['correct_answer'] == 'True' ? answer = true : answer = false;
      questionsList
          .add(Question(question: question['question'], answer: answer));
    }
    return questionsList;
  }
}

class NetworkHelper {
  final String _url;
  NetworkHelper(this._url);

  Future<dynamic> getData() async {
    http.Response response = await http.get(_url);

    if (response.statusCode == 200) {
      var jsonData = jsonDecode(response.body);
      return jsonData;
    } else {
      print(response.statusCode);
    }
  }
}

标签: dartasync-await

解决方案


QuizModel.getQestions()是一个未来。

您的程序正在打印开始、调用未来和打印结束。它不等待未来,getQuestions。

您可以将 async 添加到您的 main 中,并等待方法调用。


推荐阅读