构建函数返回 null ,FutureBuilder

时间:2021-04-27 09:38:41

标签: flutter flutter-futurebuilder

我正在尝试创建一个测验应用程序,当用户点击一张卡片时,比如说 Python 卡片,这样用户将被重定向到 Python 问题屏幕。

为此,我找到了用于执行此操作的“futurebuilder”。

这里是 loadjson 类,我在其中使用 futurebuilder 并传递一个 json 文件来获取与用户选择的卡片相关的问题。

class loadjson extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder(
        future: DefaultAssetBundle.of(context)
            .loadString("assets/questions/generalQ.json"),
        // ignore: missing_return
        builder: (context, snapshot) {
          List mydata = json.decode((snapshot.data.toString()));
          if (mydata == null) {
            Center(
              child: Text("Loading"),
            );
          } else {
            return quizpage(mydata: mydata);
          }
        },
      ),
    );
  }
}

class quizpage extends StatefulWidget {
  final mydata;
  quizpage({Key key, @required this.mydata}) : super(key: key);

  @override
  _quizpageState createState() => _quizpageState(mydata: mydata);
}

这里我正在传递我从 loadjson 获得的数据

class _quizpageState extends State<quizpage> {
  List mydata;
  _quizpageState({this.mydata});

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
      },
      child: Scaffold(
        body: Center(
          child: Text(mydata.toString()),
        ),
      ),
    );
  }
}

错误: 我出错了 返回 WillPopScope( onWillPop: () {}, 这个 WillPopScope 方法是说

 Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building FutureBuilder<String>(dirty, state: _FutureBuilderState<String>#893e9):
A build function returned null.

The offending widget is: FutureBuilder<String>
Build functions must never return null.

To return an empty space that causes the building widget to fill available room, return "Container()". To return an empty space that takes as little room as possible, return "Container(width: 0.0, height: 0.0)".

The relevant error-causing widget was
FutureBuilder<String>
lib\quizpage.dart:9
When the exception was thrown, this was the stack
#0      debugWidgetBuilderValue.<anonymous closure>
package:flutter/…/widgets/debug.dart:305
#1      debugWidgetBuilderValue
package:flutter/…/widgets/debug.dart:326
#2      ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4500
#3      StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4667
#4      Element.rebuild
package:flutter/…/widgets/framework.dart:4189
...
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═══════════════════════════════════
A build function returned null.
The relevant error-causing widget was
FutureBuilder<String>
lib\quizpage.dart:9

这是安卓屏幕错误 enter image description here

如何摆脱这个错误?请帮忙!

2 个答案:

答案 0 :(得分:1)

如果 mydata == null,您的 FutureBuilder 确实返回 null,因此您只需要在该 IF 语句正文中的 Center 小部件之前添加 return 关键字。像这样:

class loadjson extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder(
        future: DefaultAssetBundle.of(context)
            .loadString("assets/questions/generalQ.json"),
        // ignore: missing_return
        builder: (context, snapshot) {
          List mydata = json.decode((snapshot.data.toString()));
          if (mydata == null) {
            return Center(
              child: Text("Loading"),
            );
          } else {
            return quizpage(mydata: mydata);
          }
        },
      ),
    );
  }
}

答案 1 :(得分:0)

class quizpage extends StatefulWidget {
  final mydata;
  quizpage({Key key, @required this.mydata}) : super(key: key);

  @override
  _quizpageState createState() => _quizpageState();
}

class _quizpageState extends State<quizpage> {

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
      },
      child: Scaffold(
        body: Center(
          child: Text('${widget.mydata.length}'),
        ),
      ),
    );
  }
}