小部件库捕获的异常:在 null 上调用了 getter 'length'。接收者:空尝试调用:长度

时间:2021-04-24 18:44:56

标签: flutter dart

我正在尝试制作一个 Flutter 应用程序,该应用程序通过文本字段中的 SharedPreferences 存储数据。然后数据将在 SecondScreen 中动态显示。在制作这个应用程序时,我偶然发现了这个错误“NoSuchMethodError”。我想弄清楚,但我不知道错误的确切位置在哪里以及如何自己解决这个问题。你能帮我解决这个问题吗?这里说:

The relevant error-causing widget was
SecondScreen
package:midterm_exam/main.dart:111
When the exception was thrown, this was the stack
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)
#1      DynamicList.build
package:midterm_exam/main.dart:163
#2      StatefulElement.build
package:flutter/…/widgets/framework.dart:4684
#3      ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4567
#4      StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4739

这是我的 SecondScreen 代码:

class SecondScreen extends StatefulWidget {
  @override
  State createState() => new DynamicList();
}

class DynamicList extends State<SecondScreen> {
  List<String> dataLists = [];

  @override
  void initState() {
    super.initState();
    getStudentData();
  }

  getStudentData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var studentData = prefs.getStringList("data");
    setState(() {
      dataLists = studentData;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
                itemCount: dataLists.length, itemBuilder: buildList),
          )
        ],
      ),
    );
  }

  Widget buildList(BuildContext context, int index) {
    return Container(
      margin: EdgeInsets.all(4),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.blueAccent,
            width: 2,
          ),
          borderRadius: BorderRadius.circular(5)),
      child: ListTile(
        title: Text(dataLists[index]),
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:1)

获得 null 作为 dataLists 的唯一方法是,如果您从偏好中读取的内容返回 null

这让我觉得您使用的是旧版本的 Dart/Flutter,因为它甚至不应该编译使用新版本。

但如果你想保留旧版本,你可以这样做:

setState(() {
  dataLists = studentData ?? [];
});

这意味着如果 studentData 恰好是 null,请改用空列表。

答案 1 :(得分:0)

改成这样:

 Expanded(
  child: ListView.builder(
  itemCount: dataLists.length, 
  itemBuilder: (ctx, index) {
          return  Container(
      margin: EdgeInsets.all(4),
      decoration: BoxDecoration(
          border: Border.all(
            color: Colors.blueAccent,
            width: 2,
          ),
          borderRadius: BorderRadius.circular(5)),
      child: ListTile(
        title: Text(dataLists[index]),
      ),
    );
  }

并注释掉Widget buildList(BuildContext context, int index) {..etc

另外,看起来您的共享首选项返回了一个空值。

 getStudentData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    List studentData =[];
    studentData = prefs.getStringList("data");
    setState(() {
      dataLists = studentData ?? [];//this will check if it's null before assinging it.
    });
  }

我会再次仔细检查 prefs.getStringList("data"),它似乎返回了一个空值。