在下面的代码中(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/
我希望我的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
这个问题在这里已经有了答案: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]]
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我在OSX上(如果重要的话)。如果我使用RVM安装Ruby,它会默认将Bundler安装到@globalgemset假设我想要一个不同版本的bundler。我假设我需要做的就是执行geminstallbundler--version但是,这会将bundler安装到默认gemset并且RVM不会为其设置路径。因此,如果我键入bundler,它仍会启动一个与Ruby一起安装到@global中的bundler两个问题:如何将bundler安装到@globalgemset。将bundler安装到@globalgemset中的模式是否正确,或者我遗漏了什么 最佳答案
在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
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建
这段代码没有像我预期的那样执行: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#=>
fruit=["apple","red","banana","yellow"]=>["apple","red","banana","yellow"]Hash[*fruit]=>{"apple"=>"red","banana"=>"yellow"}为什么splat会导致数组被如此整齐地解析为Hash?或者更准确地说,Hash如何“知道”“apple”是键,“red”是其对应的值?仅仅是因为它们在水果数组中的位置是连续的吗?这里使用splat有关系吗?否则哈希不能直接从数组中定义自己吗? 最佳答案 作为documentation状态:H
在我的一些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
我正在运行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是一个未定义的方法。我的测试有什么