jjzjj

Flutter、Dart 和 Future。这是 Dart Futures 的已知功能并且为空吗?

coder 2023-07-22 原文

在下面的代码中(Dart 2.4.0 Windows),从指示返回类型 String 的 future 返回 null 会导致:

I/flutter ( 8735): The following assertion was thrown building Builder:
I/flutter ( 8735): type 'Future<dynamic>' is not a subtype of type 'Future<String>'

如果我返回“null as String;”,VSCode 会显示警告“unnecessary cast”,但是,代码可以运行,我不会收到 fatal error 。 有问题的代码如下。我已经注释掉导致问题的行,现在返回“null as String”。 我一直在 Dart 中使用 null String 没有问题,所以它似乎只是 Futures AFAIK 的问题。 这只是关于 Dart 和 Futures 的一个已知事实吗?这就是解决方法(“将 null 作为字符串返回”)?

 @override
  void initState() {
    super.initState(); 
    Future<String> future = _initPreferences();
    future.then((sError) {
      if (sError != null) debugPrint("\n*** Error from initPrefs = $sError\n");
      if (sError == null) debugPrint("\n***Preferences were initialized OK\n");
    });
  }

  Future<String> _initPreferences() {
    return SharedPreferences.getInstance().then((prefs) {
      _prefs = prefs;
      //return null;
      return null as String;
    }).catchError((vError) {
      return "Unable to load categories";
    });
  }

最佳答案

您在使用 Future.then 时没有指定类型,所以必须推断。自从你回来null ,它不知道它应该是什么类型,所以你调用 Future.then不返回 Future<String> .

您可以通过 then<String>(...) 显式指定类型来帮助推理引擎。 :

Future<String> _initPreferences() {
  return SharedPreferences.getInstance().then<String>((prefs) {
    _prefs = prefs;
    return null;
  }).catchError((vError) {
    return "Unable to load categories";
  });
}

尽管使用 async 会更好和 await :

Future<String> _initPreferences() async {
  try {
    final prefs = await SharedPreferences.getInstance();
    _prefs = prefs;
    return null;
  } catch (vError) {
    return "Unable to load categories";
  }
}

这里是一个更简单的复现案例:

Future<String> foo() {
  final future = Future(() => null);
  print('${future.runtimeType}');
  return future;
}

Future<void> main() async {
  await foo();
}

我希望 future成为Future<Null> , 但它最终是一个 Future<dynamic>相反,我不确定为什么。 ( Null 是特殊的,允许将 Future<Null> 分配给 Future<T> 。)我怀疑这可能是一个错误,因为 dartanalyzer不会生成任何关于它的警告。 (与一些评论所说的相反,这似乎不是 Dart 2.4.0 的新功能;我尝试使用 Dart 2.3.0、2.3.2 和 2.4.0。)我已经提交了 an issue about it .

关于Flutter、Dart 和 Future。这是 Dart Futures 的已知功能并且为空吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56796121/

有关Flutter、Dart 和 Future。这是 Dart Futures 的已知功能并且为空吗?的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

  3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  4. ruby - 如何在 RVM 下将 Bundler 安装到 @global gemset,这是正确的方法吗 - 2

    我在OSX上(如果重要的话)。如果我使用RVM安装Ruby,它会默认将Bundler安装到@globalgemset假设我想要一个不同版本的bundler。我假设我需要做的就是执行geminstallbundler--version但是,这会将bundler安装到默认gemset并且RVM不会为其设置路径。因此,如果我键入bundler,它仍会启动一个与Ruby一起安装到@global中的bundler两个问题:如何将bundler安装到@globalgemset。将bundler安装到@globalgemset中的模式是否正确,或者我遗漏了什么 最佳答案

  5. c - 这是什么宏? - 2

    在ruby.h中,有很多函数宏是这样定义的:staticinlineint#ifdefined(HAVE_PROTOTYPES)rb_type(VALUEobj)#elserb_type(obj)VALUEobj;#endif{if(FIXNUM_P(obj))returnT_FIXNUM;if(obj==Qnil)returnT_NIL;if(obj==Qfalse)returnT_FALSE;if(obj==Qtrue)returnT_TRUE;if(obj==Qundef)returnT_UNDEF;if(SYMBOL_P(obj))returnT_SYMBOL;returnBU

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby - 当你有一个没有参数的 case 语句并且 when 子句是 lambda 时会发生什么? - 2

    这段代码没有像我预期的那样执行:casewhen->{false}then"why?"else"ThisiswhatIexpect"end#=>"why?"这也不是casewhen->(x){false}then"why?"else"ThisiswhatIexpect"end#=>"why?"第一个then子句在两种情况下都被执行,这意味着我提供给when子句的lambda没有被调用。我知道无论when子句的主题是什么,都应该调用大小写相等运算符===。我想知道当没有为case提供参数时,===的另一边会发生什么。我在想它可能是nil,但它不可能是:->{false}===nil#=>

  8. ruby - 从数组中生成哈希 - 这是如何工作的? - 2

    fruit=["apple","red","banana","yellow"]=>["apple","red","banana","yellow"]Hash[*fruit]=>{"apple"=>"red","banana"=>"yellow"}为什么splat会导致数组被如此整齐地解析为Hash?或者更准确地说,Hash如何“知道”“apple”是键,“red”是其对应的值?仅仅是因为它们在水果数组中的位置是连续的吗?这里使用splat有关系吗?否则哈希不能直接从数组中定义自己吗? 最佳答案 作为documentation状态:H

  9. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  10. ruby-on-rails - Rspec 测试属于并且有很多 - 2

    我正在运行rspec测试以确保两个模型通过has_many和belongs_to相互关联。下面是我的测试。describe"testingforhasmanylinks"dobeforedo@post=Post.new(day:"Day1",content:"Test")@link=Link.new(post_id:@post.id,title:"google",url:"google.com")endit"inthepostmodel"do@post.links.first.url.should=="google.com"endend测试告诉我url是一个未定义的方法。我的测试有什么

随机推荐