【问题标题】:Future<bool> function returns null value flutterFuture<bool> 函数返回空值颤动
【发布时间】:2021-05-22 14:08:20
【问题描述】:

在发布之前,我查看了以前的问题(因为有很多),但我没有找到适合我需要的东西。

我有一个函数可以检查 Firestore 上是否存在文档,如果文档存在,则该函数必须返回 false,否则如果不存在,则返回 true。

问题是函数的返回总是 null 并且编译器告诉我该函数没有返回语句但我不明白为什么。

这是代码,重要的功能是checkMissingId,另一个只是检查字符串id是否具有有效的格式。

代码:

bool checkStr(String id, String letter, String str) {
  if (id.length < 1) {
    print("Id is too short");
    return false;
  } else {
    if ('a'.codeUnitAt(0) > letter.codeUnitAt(0) ||
        'z'.codeUnitAt(0) < letter.codeUnitAt(0)) {
      print("User name begins with bad word!");
      return false;
    }
    print("ids/tabs/" + letter);
    return true;
  }
}

Future<bool> checkMissingId(String id, context) async {
  String str = id.toLowerCase();
  String letter = str[0];
  if (checkStr(id, letter, str) == false)
    return false; //checks some rules on strings
  else {
    try {
      await FirebaseFirestore.instance.collection("ids/tabs/" + letter).doc(str).get()
          .then((DocumentSnapshot documentSnapshot) { //Maybe here!(??)
        if (documentSnapshot.exists) {
          print("Document exists!");
          return false;
        } else {
          print('Document does not exist on the database');
          return true;
        }
      });
    } catch (e) {
      await showErrDialog(context, e.code);
      return false;
    }
  }
}

【问题讨论】:

  • 您在 try 块中等待操作,但您永远不会返回值。顺便说一句,你为什么混合awaitthen 语法?似乎违反直觉。
  • 要获得 Future&lt;bool&gt; 值,您应该像这样使用它:Future.value(false)

标签: flutter dart asynchronous


【解决方案1】:

问题是您同时使用 await.then() 从 Firestore 获取数据。用这个替换你的函数以获得所需的结果:

Future<bool> checkMissingId(String id, context) async {
  String str = id.toLowerCase();
  String letter = str[0];
  if (checkStr(id, letter, str) == false) return false; //checks some rules on strings
  else {
    try {
      DocumentSnapshot documentSnapshot = await FirebaseFirestore.instance.collection("ids/tabs/" + letter).doc(str).get();
      if (documentSnapshot.exists) {
        print("Document exists!");
        return false;
      } else {
        print('Document does not exist on the database');
        return true;
      }
    } catch (e) {
      await showErrDialog(context, e.code);
      return false;
    }
  }
}

【讨论】:

  • 另一个人更快,但我很感激!顺便说一句,你评论了我的很多帖子,谢谢!
  • 没问题。是的,我才发现昨天也是你的帖子
【解决方案2】:

试试这个:

Future<bool> checkMissingId(String id, context) async {
  String str = id.toLowerCase();
  String letter = str[0];
  if (checkStr(id, letter, str) == false)
    return false; //checks some rules on strings
  else {
    try {
      var data = await FirebaseFirestore.instance.collection("ids/tabs/" + letter).doc(str).get()
        if (data.exists) {
          print("Document exists!");
          return false;
        } else {
          print('Document does not exist on the database');
          return true;
        }
    } catch (e) {
      await showErrDialog(context, e.code);
      return false;
    }
  }
}

问题是在.then(...) 函数中,它需要一个函数作为输入。所以,你将无法返回任何东西。因为它不会向您的函数返回数据。

【讨论】:

  • 错了。 .then()可以返回一个Future,它确实在OP的代码中返回一个Future&lt;bool&gt;。但是,他在try 块中没有返回任何内容,并且混合了两种语法,这没有多大意义。
  • 你说得对我混了,因为我在编码时遇到了一些麻烦,我没有清除代码。
  • 是的,但我的代码应该有助于纠正这个问题。所以,这应该不是问题。
  • 是的,它解决了,我把“then”随机放在那里,我很愚蠢:S
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2020-09-11
  • 2020-04-14
相关资源
最近更新 更多