下面是我在IDE上拥有的错误日志。
在1,172 in中重新启动应用程序。I/flutter (24036):由小部件库╞═══════════════════════════════════════════════════════════I/flutter (24036)捕获的══╡异常: NoSuchMethodError抛出构建FutureBuilder(脏,状态:I/颤振(24036):_FutureBuilderState#bf7da):i/颤振(24036):getter 'length‘被调用为null。I/颤振(24036):接收器:空I/颤振(24036):尝试调用:长度I/颤振(24036):I/颤振(24036):相关的导致错误的部件是:[38;5;248 53/颤振(24036):FutureBuilder[39;49m I/颤振(24036):I/颤振(24036):当异常被抛出时,这是堆栈:[38;5;244mI/颤振(24036):#0 Object.noSuchMethod (dart:core-Object.noSuchMethod/object_patch.dart:53:5)][39;49m [38;5;248 38/颤振(24036):#1 _JsonDataState.build.][39;49m[38;5;244 38/颤振(24036):#2 _FutureBuilderState.build[39;49m [38;5;5;244 38/颤振(24036)]:#3 StatefulElement.build[39;49m;5;244 38/颤振(24036):#4 ComponentElement.performRebuild[39;49m [38;5;244 38/248mI(24036)]:#5 StatefulElement.performRebuild[39;49m [38;38;5];244mI/颤振(24036):#6 Element.rebuild[39;49m [38;5;244 38/颤振(24036)]:#7 ComponentElement._firstBuild[39;49m [38;5;244 38/颤振(24036):#8 StatefulElement._firstBuild[39;49m [38;5;5;244 38/颤振(24036)]:#9 ComponentElement.mount[39;49m I/颤振(24036)]:.标准元件安装(22帧)[38;5;244 32/颤振(24036):#31 Element.inflateWidget[39;49m [38;5;244 32/颤振(24036):#32 MultiChildRenderObjectElement.mount[39;49m I/颤振(24036):.]普通元件安装(193个框架)[38;5;244 39/颤振(24036):#225 Element.inflateWidget[39;49m [38;5;244 39/颤振(24036):#226 MultiChildRenderObjectElement.mount[39;49m I/颤振(24036):.]法向元件安装(253帧) [38;5;244 39/颤振(24036):#479 Element.inflateWidget[39;49m [38;5;5;244 39/颤振(24036):#480 Element.updateChild][39;49m[38;5;244 39/颤振(24036)]:#481 RenderObjectToWidgetElement._rebuild[39;49m [38;5;244 39/颤振(24036)]:#482 RenderObjectToWidgetElement.mount[39;49m [38;5;244 39/颤振(24036)]:#483 Element.updateChild[38;5;244 39/颤振(24036):#484 RenderObjectToWidgetAdapter.attachToRenderTree[39;49m [39;49m[38;5;244 39/颤振(24036)]:#485 BuildOwner.buildScope[38;5;244 39/颤振(24036):#486 WidgetsBinding.attachRootWidget[39;49m [38;5;244 39/颤振(24036)]:#487 WidgetsBinding.scheduleAttachRootWidget。49米I/颤振(24036):(从_RawReceivePortImpl类,_Timer类,dart:异步,11帧和飞镖:异步补丁)I/颤振(24036):I/颤振(24036):════════════════════════════════════════════════════════════════════════════════════════════════════
[38;5;248 m NoSuchMethodError异常被小部件库═══════════════════════════════════捕获[39;49m[38;5;244 m]下面的════════被抛出构建FutureBuilder(脏,状态:
_FutureBuilderState#bf7da):[39;49m,getter 'length‘被调用为null。接收方:空尝试调用:长度
[38;5;244 m]相关的导致错误的小部件是[39;49m[38;5;248 248mFutureBuilder][39;49m[38;5;244 m]当异常抛出时,这是堆栈[39;49m] [38;5;244m#0 Object.noSuchMethod _JsonDataState.build [38;5;248m#1 _JsonDataState.build]。[39;49m]38;5;244m#2 _FutureBuilderState.build[39;49m [38;5];[38;5;248m════════════════════════════════════════════════════════════════════════════════[39;49m 244m#3 StatefulElement.build[39;49m ] [38;5;244m#4 ComponentElement.performRebuild][38;5;244米][39;49m]
下面是运行的代码。该应用程序正在运行,但在启动时出现了错误和几秒钟的红色屏幕。
`import 'dart:convert';
import 'package:flutter/material.dart';
class JsonData extends StatefulWidget {
@override
_JsonDataState createState() => _JsonDataState();
}
class _JsonDataState extends State<JsonData> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page Data Visualization'),
),
body: Center(
child: FutureBuilder(
builder: (context, snapshot) {
var myData = json.decode(snapshot.data.toString());
return ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Card(
child: ListTile(
leading: CircleAvatar(
child: Text(myData[index]['trade_code'][0])),
title: Text(myData[index]['trade_code']),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
"\nHigh:" + myData[index]['high'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.left,
),
Text(
"Low:" + myData[index]['low'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.left,
),
Text(
"Open:" + myData[index]['open'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.left,
),
Text(
"Close:" + myData[index]['close'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.left,
),
Text(
"Volume:" + myData[index]['volume'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.left,
),
Text(
"\nDate:" + myData[index]['date'],
style: TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
],
),
isThreeLine: true,
),
elevation: 3,
);
},
itemCount: myData.length,
);
},
future: DefaultAssetBundle.of(context)
.loadString("assets/stock_market_data.json")),
),
);
}
}
`发布于 2020-08-30 10:46:48
构建器函数执行几次。首先,没有数据。稍后,用数据。
但是,通过这样做,您可以假设它总是有数据:
var myData = json.decode(snapshot.data.toString());在这里,snapshot.data最初是空的。这就是为什么你得到了一个例外。
只需遵循文档中的模式即可。https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
if (snapshot.hasData) {
var myData = json.decode(snapshot.data.toString());
} else if (snapshot.hasError) {
// show error widget
} else {
// show loading widget
}我最近谈到的一些具体例子:
https://youtu.be/p8dY_tsAbx8?t=5382
https://youtu.be/p8dY_tsAbx8?t=5633
而且,这种用法也不好,每次执行构建函数时,您都要创建一个未来:
future: DefaultAssetBundle.of(context)
.loadString("assets/stock_market_data.json")),相反,您应该将未来缓存在iniState中。在这里解释:https://youtu.be/p8dY_tsAbx8?t=5683
https://stackoverflow.com/questions/63656510
复制相似问题