为什么不设置var(Dart)

时间:2015-08-08 06:09:11

标签: dart dart-async

我在Dart尝试这个:

import 'dart:convert';
import 'dart:html';

class testHandler {

  Map parsedJSON;

  testHandler();

  void Initialize(){
    String rawJSON = "core/testConfiguration.json";

    HttpRequest.getString(rawJSON)
    .then((String f) => parsedJSON.from(JSON.decode(f)))
    .catchError((Error e) => print(e.toString()));

    print(parsedJSON);
  }
}

如果您在parsedJSON中看到我正在设置 .then() ,但在我尝试获取var时,它会返回null。

2 个答案:

答案 0 :(得分:2)

print(parsedJSON);返回之前执行

getString()getString()是异步的,传递给then()的回调有时会在getString()返回结果后执行,但print(parsedJSON);会立即执行。

使用async / await可以轻松完成:

import 'dart:convert';
import 'dart:html';

class testHandler {

  Map parsedJSON;

  testHandler();

  Future Initialize() async {
    String rawJSON = "core/testConfiguration.json";

    try {
      String f = await HttpRequest.getString(rawJSON);
      parsedJSON = JSON.decode(f);
    } catch(Error e) { 
      print(e.toString());
    } 

    print(parsedJSON);
  }
}

Async具有传染性,因此代码调用Initialize()也必须等待它完成。

答案 1 :(得分:0)

不,您没有在parsedJSON中设置.then()。您正在尝试从null对象调用方法。在使用parsedJSON之前,您应该使用=运算符进行设置,例如

parsedJSON = new Map.from(JSON.decode(f));

换句话说,你混合了parsedJSON的方法和Map的构造函数。

<强> P.S。 而且,正如冈特所说,你可以写一下:

parsedJSON = JSON.decode(f);