首页 > 解决方案 > 异步函数一个接一个地返回两个不同的结果

问题描述

我编写了一个异步 Flutter/Dart 函数,在我看来它的行为出乎意料。以下代码结构:

static Future<bool> verifySometing() async {
   try {
      await getCloudData().then((snapshot) {
         if (snapshot.exists && snapshot.hasData) {
            bool dataValid = await validateData(snapshot.data);
            if (dataValid) {
               print('Data is correct');
               return true;
            }
         }
      });
   } catch (e) {
      print('Error $e');
      return false;
   }
   print('Something went wrong');
   return false;
}

预期的结果是该函数等待云数据,然后等待验证,如果数据有效则返回 true。在这种情况下,控制台将显示以下内容并且函数将返回 true:

Data is correct

实际发生的情况是控制台显示以下输出,并且该函数首先返回 true,然后返回 false:

Data is correct
Something went wrong

这与我想知道的关于 Dart 中的函数的任何事情都背道而驰,因为我总是假设一旦触发 return,函数就完成了。任何想法这是如何发生的?

标签: functionflutterdartasynchronousasync-await

解决方案


问题在于这条线。

await getCloudData().then((snapshot) {

await在这里,您还附加了一个then回调,而不仅仅是ing。所以实际上,无论您返回什么都是callback函数的返回值,即 ., (snapshot) {}.

您需要传入的回调函数将thenreturn true作为await.

所以,如果你会放一些类似的东西

var bool = await getCloudData().then((snapshot) { ..... });

那么这个bool,就等于true。而已。您的主要功能没有返回。

改成这样,

var snapshot = await getCloudData();
if (snapshot.exists && snapshot.hasData) {
  bool dataValid = await validateData(snapshot.data);
  if (dataValid) {
    print('Data is correct');
    return true;
  }
}

希望,我能够解释清楚。


推荐阅读