首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的未来构建器在屏幕上给出了几秒钟的错误,然后显示结果,这里是错误日志

我的未来构建器在屏幕上给出了几秒钟的错误,然后显示结果,这里是错误日志
EN

Stack Overflow用户
提问于 2020-08-30 10:33:49
回答 1查看 501关注 0票数 0

下面是我在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]

下面是运行的代码。该应用程序正在运行,但在启动时出现了错误和几秒钟的红色屏幕。

代码语言:javascript
复制
`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")),
      ),
    );
  }
}
`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-30 10:46:48

构建器函数执行几次。首先,没有数据。稍后,用数据。

但是,通过这样做,您可以假设它总是有数据:

代码语言:javascript
复制
              var myData = json.decode(snapshot.data.toString());

在这里,snapshot.data最初是空的。这就是为什么你得到了一个例外。

只需遵循文档中的模式即可。https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

代码语言:javascript
复制
        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

而且,这种用法也不好,每次执行构建函数时,您都要创建一个未来:

代码语言:javascript
复制
            future: DefaultAssetBundle.of(context)
                .loadString("assets/stock_market_data.json")),

相反,您应该将未来缓存在iniState中。在这里解释:https://youtu.be/p8dY_tsAbx8?t=5683

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63656510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档