flutter 如何解决“NoSuchMethodError:在null上调用了方法“[]”

ozxc1zmp  于 2023-01-02  发布在  Flutter
关注(0)|答案(1)|浏览(585)

gamelist是集合中文档名称的字符串列表。questionMap值是一个名为"text"字段的数组,该数组是使用gamelist值作为键从firestore文档中获得的。我希望在按下pass按钮时更新questionMap。当我按下pass按钮时,我看到questionMap确实在我打印此代码时更新,但是屏幕没有重新绘制,我得到了标题中显示的错误。这是一个脏代码,但我想知道如何解决它。
这是我的代码:

class PlayPage extends StatefulWidget {
  List gameList;
  Map questionMap;
  String category;
  int myScore;

  PlayPage({
    required this.gameList,
    required this.category,
    required this.myScore,
    required this.questionMap,
  });

  @override
  State<PlayPage> createState() => _PlayPageState();
}

class _PlayPageState extends State<PlayPage> {
  int quizNumber = 0;
  int listNumber = 0;
  var db = FirebaseFirestore.instance;

  void changeQuiz() {
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Stack(
        children: [
          Card(
            child: SizedBox(
              height: double.infinity,
              child: SingleChildScrollView(
                child: Padding(
                  padding: const EdgeInsets.only(
                      top: 20, bottom: 200, left: 20, right: 20),
                  child: Text(
                    widget.questionMap[widget.gameList[listNumber]][quizNumber],
                    style: const TextStyle(fontSize: 20),
                  ),
                ),
              ),
            ),
          ),
          Positioned(
            right: 10,
            bottom: 30,
            child: Column(
              children: [
                ElevatedButton(
                  child: const Text(
                    "Pass",
                    style: TextStyle(fontSize: 30),
                  ),
                  onPressed: () {
                    listNumber += 1;
                    quizNumber = 0;
                    setState(
                      () {
                        var docRef = db
                            .collection(widget.category)
                            .doc(widget.gameList[listNumber]);
                        docRef.get().then(
                          (DocumentSnapshot doc) {
                            var data = doc.data() as Map<String, dynamic>;
                            List questions = selectQuiz(
                              data["text"],
                            );
                            widget.questionMap = {
                              widget.gameList[listNumber]: questions
                            };
                            print(widget.questionMap);
                          },
                        );
                      },
                    );
                  },
                ),
                const SizedBox(height: 30),
                SizedBox(
                  width: 70,
                  height: 70,
                  child: FloatingActionButton(
                    backgroundColor:
                        (quizNumber < 9) ? Colors.teal : Colors.grey,
                    child: const Icon(
                      Icons.arrow_forward,
                      size: 35,
                    ),
                    onPressed: () {
                      if (quizNumber < 9) {
                        setState(
                          () {
                            quizNumber += 1;
                          },
                        );
                      }
                    },
                  ),
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}
vltsax25

vltsax251#

在你尝试访问它之前,请确保你试图访问的对象不是空的。错误消息NoSuchMethodError: The method '[]' was called on null告诉你你已经对空调用了索引([])运算符。
当调用了某个方法或属性,但由于某种类型不匹配或作为参数传递给该方法或属性的数据格式不正确而导致该方法或属性不存在于当前上下文中时,会发生此错误。请检查堆栈跟踪并查看发生错误的行号。
如上所述here
例如,假设您看到:

Unhandled exception:
NoSuchMethodError: The method '[]' was called on null.
Receiver: null
Tried calling: []("data")
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      main (file:///Users/cbracken/foo.dart:3:23)
...

上面的堆栈跟踪告诉你对null对象的调用是在文件foo. dart的第3行main中进行的。此外,它还告诉你[]操作符是用参数'data'调用的。如果我在代码中查看该行,它显示var foo = json['localteam']['data'],那么我可以推断json['localteam']返回null。
它可以通过确定它发生的确切位置,然后修复与参数传递相关的错别字/错误,并确保正确的变量声明来解决。

相关问题