Flutter 为什么可以';我是否从共享首选项导入读取数据?
我有一个ListView.builder,它根据用户输入构建一定数量的小部件。每个小部件都有自己的特定名称和下拉菜单。我将此值与小部件的相应名称一起保存。它正确地保存了它。但是,当我尝试读取数据并从中创建一个新列表时,会出现以下错误:[error:flatter/lib/ui/ui\u dart\u state.cc(157)]未处理的异常:NoSuchMethodError:方法“[]”在null上被调用 “课程”是一个列表。我正在使用共享首选项导入。当您点击平面按钮时,它应该生成新列表,但它不是。你能解释一下为什么这不起作用吗 这是主应用程序中的代码Flutter 为什么可以';我是否从共享首选项导入读取数据?,flutter,Flutter,我有一个ListView.builder,它根据用户输入构建一定数量的小部件。每个小部件都有自己的特定名称和下拉菜单。我将此值与小部件的相应名称一起保存。它正确地保存了它。但是,当我尝试读取数据并从中创建一个新列表时,会出现以下错误:[error:flatter/lib/ui/ui\u dart\u state.cc(157)]未处理的异常:NoSuchMethodError:方法“[]”在null上被调用 “课程”是一个列表。我正在使用共享首选项导入。当您点击平面按钮时,它应该生成新列表,但它
void main() {
runApp(Hemis());
}
class Hemis extends StatefulWidget {
@override
_HemisState createState() => _HemisState();
}
class _HemisState extends State<Hemis> {
_read() async {
final prefs = await SharedPreferences.getInstance();
for(int i = 0; i < course.length; i++) {
listMarks[i].name = course[i].name;
listMarks[i].mark = prefs.getInt(course[i].name) ?? 0;
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
ListView.builder(
itemCount: course.length,
itemBuilder: (context, index) {
return ModuleListItem(
name: '${course[index].name}',
credits: course[index].credits,
);
},
),
FlatButton(
onPressed: () {
_read();
for(int i = 0; i < course.length; i++) {
print('${listMarks[i].name}: ${listMarks[i].mark}');
}
},
),
],
),
)
)
);
}
}
void main(){
runApp(Hemis());
}
类Hemis扩展StatefulWidget{
@凌驾
_HemisState createState()=>\u HemisState();
}
类_HemisState扩展状态{
_read()异步{
final prefs=wait SharedPreferences.getInstance();
for(int i=0;i
正在构建的小部件
final percentage = List<String>.generate(100, (i) => "$i");
class ModuleListItem extends StatefulWidget {
const ModuleListItem ({ Key key, this.name, this.credits }): super(key: key);
final String name;
final int credits;
@override
_ModuleListItemState createState() => _ModuleListItemState();
}
class _ModuleListItemState extends State<ModuleListItem> {
String dropdownValue;
bool isSwitched = false;
_save() async {
final prefs = await SharedPreferences.getInstance();
final key = '${widget.name}';
final value = int.parse(dropdownValue);
prefs.setInt(key, value);
print('saved $value');
}
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.keyboard_arrow_down),
onChanged: (String newValue) {
setState(() {
dropdownValue = newValue;
});
},
items: percentage.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
),
Switch(
value: isSwitched,
onChanged: (value) {
setState(() {
isSwitched = value;
if(isSwitched == true) {
_save();
}
print(isSwitched);
});
},
),
],
),
);
}
}
final percentage=List.generate(100,(i)=>“$i”);
类ModuleListItem扩展StatefulWidget{
const ModuleListItem({Key-Key,this.name,this.credits}):super(Key:Key);
最后的字符串名;
最终积分;
@凌驾
_ModuleListItemState createState()=>\u ModuleListItemState();
}
类_ModuleListItemState扩展状态{
字符串下拉值;
bool isSwitched=false;
_save()异步{
final prefs=wait SharedPreferences.getInstance();
final key='${widget.name}';
最终值=int.parse(dropdownValue);
prefs.setInt(键、值);
打印(“保存的$value”);
}
@凌驾
小部件构建(构建上下文){
返回行(
儿童:[
下拉按钮(
value:dropdownValue,
图标:图标(图标。键盘箭头向下),
onChanged:(字符串newValue){
设置状态(){
dropdownValue=newValue;
});
},
项目:百分比.map((字符串值){
返回下拉菜单项(
价值:价值,
子项:文本(值),
);
}).toList(),
),
),
开关(
值:已切换,
一旦更改:(值){
设置状态(){
isSwitched=值;
如果(isSwitched==true){
_save();
}
打印(isSwitched);
});
},
),
],
),
);
}
}
欢迎使用堆栈溢出。。为了快速得到答案,你应该在这里提供简短的可复制代码,这些代码关注你正在遇到的问题,而不是应用程序中的全部代码。。。人们通常不想通过你的应用程序中大量无关的代码来帮助你。请阅读如何要求得到关于这件事的解释。祝你好运,谢谢你的回答。我很感激你的建议。我会调整的。欢迎来到Stack Overflow。。为了快速得到答案,你应该在这里提供简短的可复制代码,这些代码关注你正在遇到的问题,而不是应用程序中的全部代码。。。人们通常不想通过你的应用程序中大量无关的代码来帮助你。请阅读如何要求得到关于这件事的解释。祝你好运,谢谢你的回答。我很感激你的建议。我会做出调整。