草庐IT

dart - 无效参数 : The source must not be null

coder 2023-07-21 原文

我有一个从远程 API 获取一些数据的应用程序。因此,我将接收并在 JSON Future 中显示的数据: {"status":200,"out":{"summary":[{"bc":"1876","wc":"488679","pc":"731904"}],"last":[{ "id":"1877","place":"7","publisher":"-1","bookid":"01877","title":"非文不仆","author":"Peh ","re​​gion":"\u65b0\u52a0\u5761","copyrighter":"","translated":"0","purchdate":"2017-04-18","price":"200.00", “pubdate”:“2016-01-01”,“printdate”:“2016-01-01”,“ver”:“1.1”,“deco”:“\u666e\u901a”,“kword”:“0” "page":"220","isbn":"978-981-4642-63-7","category":"","location":"","intro":"TT\u8d60\u4e66\u3002","instock":"1","p_name":"\uff08\u672a\u6307\u5b9a\uff09"}]}}

我将从这个 JSON 中提取 out 字段并将 summarylast 分配给两个变量:

initState() async {
    var getter = createHttpClient();
    String uri='http://api.rsywx.com/book/summary';
    var res=await getter.get(uri);
    Map data=JSON.decode(res.body);

    var out=data['out'];

    setState(() {
      _today=formatDate(new DateTime.now());
      _lb=out['last'][0];
      _bs=out['summary'][0];
      _lb['purchdate']=formatDate(DateTime.parse(_lb['purchdate']));
    });
  }

所以_bs_lb都是复合对象。

在我的小部件 build 函数中,我将显示这两个对象的内容:

 new TextSpan(
     text: numFormatter.format(int.parse(_bs['bc'])),
     style: aboutTextStyle,
 ),

程序编译正常,但启动时,会出现快速启动的红色屏幕:

很快,正确的屏幕就会出现:

我知道在初始构建期间,对象_bs_lb还不存在,并且对远程API的异步调用是仍在尝试填充返回的响应,因此在这种情况下,_bs['bc'] 肯定不可调用。因此弹出非阻塞错误。

解决方法

我可以通过声明一堆变量并在 initState 函数中分配它们来消除这个错误;我将渲染一个新变量 _bookCount,而不是渲染 _bs['bc']。这样,渲染将在没有这个红色屏幕的情况下完成,并且该变量的值最初将为 null,并且很快就会成为从远程 API 获取的正确值。

但这太麻烦了,如果你明白我的意思:很多只使用一次的变量。

或者,我应该在父级获取数据,以便将其作为 Prop 传递给这个小部件吗?还没试过。

感谢您的最佳实践输入。

更新

问题确实来自int.parse。如果我取消了那个调用,程序就会和平运行。

那么现在的问题就变成了

我会抑制 int.parse 在要解析的值变为有效之前提示错误。

最佳答案

不确定您的解决方法是什么意思。在您的示例中,setState() 不会在 await getter.get(uri); 返回值之前被调用。

我想这应该可以

 new TextSpan(
     text: _bs != null && _bs['bc'] != null ? [numFormatter.format(int.parse(_bs['bc'])) : 0,
     style: aboutTextStyle,
 ),

关于dart - 无效参数 : The source must not be null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43646511/

有关dart - 无效参数 : The source must not be null的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  8. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  9. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐