首页 > 解决方案 > 如何获取 HttpRequest 的结果?

问题描述

我正在使用 dart 为移动设备编写游戏。我的级别配置存储为 json。通过httpRequest我从服务器获取 JSON,然后解析我的 json。它应该创建一个关卡对象。我想在我的模型中使用它。但我不能将它分配给我的模型中的 level-reference (model.level)。在HttpRequest它的值仍然相同(null)之后。我的想法也是使用一些回调艺术,但我不知道如何......

  static void load(final int levelNr, Game model) {
    final String path = "../json/$levelNr.json";

    HttpRequest.getString(path).then((lvlJson) {
      Map data = JSON.decode(lvlJson);
      Level level = _levelFromMap(data);
      model.level = level;
    });
  }

标签: asynchronousdart

解决方案


您可以使用callbackasync await

1. 回调

static void load(final int levelNr, void callbackFunction(Level level)) {
 final String path = "../json/$levelNr.json";

 HttpRequest.getString(path).then((lvlJson) {
  Map data = JSON.decode(lvlJson);
  Level level = _levelFromMap(data);
  callbackFunction(level);
 });
}

用法:

load(levelNrValue, (level) {
  model.level = level;
  //refresh view or data to reflect the change in model.
})

2.异步和等待

static Future<Level> load(final int levelNr) async {
 final String path = "../json/$levelNr.json";

 final response = await HttpRequest.getString(path);
 Map data = JSON.decode(lvlJson);
 return _levelFromMap(data);
}

用法:

1)在调用处使用回调:

load(levelNrValue).then((level) { 
  model.level = level;
  //refresh view or data to reflect the change in model.
});

2)在调用位置也使用异步:

final level = await load(levelNrValue);
model.level = level;

注意:以上两行应该在一些异步方法中。

void loadDate(int levelNrValue, Game model) async {
  final level = await load(levelNrValue);
  model.level = level;
  //refresh view or data to reflect the change in model.
}

推荐阅读