Flutter 为什么可以';我是否从共享首选项导入读取数据?

Flutter 为什么可以';我是否从共享首选项导入读取数据?,flutter,Flutter,我有一个ListView.builder,它根据用户输入构建一定数量的小部件。每个小部件都有自己的特定名称和下拉菜单。我将此值与小部件的相应名称一起保存。它正确地保存了它。但是,当我尝试读取数据并从中创建一个新列表时,会出现以下错误:[error:flatter/lib/ui/ui\u dart\u state.cc(157)]未处理的异常:NoSuchMethodError:方法“[]”在null上被调用 “课程”是一个列表。我正在使用共享首选项导入。当您点击平面按钮时,它应该生成新列表,但它

我有一个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。。为了快速得到答案,你应该在这里提供简短的可复制代码,这些代码关注你正在遇到的问题,而不是应用程序中的全部代码。。。人们通常不想通过你的应用程序中大量无关的代码来帮助你。请阅读如何要求得到关于这件事的解释。祝你好运,谢谢你的回答。我很感激你的建议。我会做出调整。