我正在尝试制作一个 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]),
),
);
}
}
答案 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")
,它似乎返回了一个空值。