颤动等待结果始终为null

时间:2019-01-05 10:59:35

标签: firebase firebase-realtime-database dart async-await flutter

这是我的职责

Future<Address> readAddress() async {
    database = FirebaseDatabase(app: app);

   await  database
        .reference()
        .child(table_name)
        .child(uid)
        .once()
        .then((DataSnapshot snapshot) {
      print("address_start");
      if (snapshot.value == null) {
        print("address_start_value_null");
        return null;
      } else {
         print("address_start_value_not_null");
        print(snapshot.value);
        Address a = Address().map(snapshot.value);
      return  a;
     // return a;
      }


    }).catchError((onError) {
      print(onError);
      return onError;
    });
  }

这是我的函数调用

readAddress().then((address) {

        if (address != null) {
          print("address read seucssfully " + address.firstname);
        } else {
          print(
              "address read faield result is null $address"); // + address.toString());

        }
      }).catchError((onError) {
        print("error on read address");
      });

但是这里总是返回null。
怎么了?

来自readAddress()函数的消息

  

[dart]此函数的返回类型为'Future',但是   不以return语句结尾。 [missing_return]


在尝试发布此问题时,我不知道要解释此错误消息的更多StackOverflow信息:“看起来您的帖子主要是代码;请添加更多详细信息。 “

1 个答案:

答案 0 :(得分:1)

函数的问题是它没有返回Future,而是返回了Address对象。我会这样重写您的函数,只返回Address对象

 Future<Address> readAddress() async {
    try{
    database = FirebaseDatabase(app: app);

   DataSnapshot snapshot = await  database
        .reference()
        .child(table_name)
        .child(uid)
        .once();
    return Address().map(snapshot.value);
    }catch(e) {
      print(e);
      return(e);
    }
  }

有了这个,您的函数调用就可以是这样:

Address address = readAddress();

很简单,不是吗?我已经注意了函数内部的所有错误处理。