【问题标题】:Error screen while loading sharedpreferences Flutter加载共享首选项时出现错误屏幕 Flutter
【发布时间】:2020-07-16 13:08:08
【问题描述】:

您好,我在 Flutter 应用上使用 SharedPreferences 时遇到问题。加载要在构建函数中公开的 SharedPreferences 时出现错误屏幕。目前所有内容都已加载,我可以毫无错误地使用我的应用程序。 我得到的错误代码:“方法 getStringList 在 null 上被调用”。这是我的代码:

SharedPreferences sp;
List<String> toprun = ["181","103","90","0","0","0","0","0","0","0"];

@override
void initState(){

SharedPreferences.getInstance().then((SharedPreferences shared)
{
  sp = shared;
  sp?.setStringList('toprun', toprun);
});      //Setting Data in my sp 
}

@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: const Text('Title'),
    backgroundColor: Colors.redAccent,
  ),
  body: Padding(
    padding: EdgeInsets.fromLTRB(30.0, 40.0, 30.0, 0.0),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget> [
        DataTable(
          columns: [
            DataColumn(label: Text('Results')),
          ],
          rows:
          sp.getStringList('toprun') // Get data I previously saved in my sp
              .map(
            ((element) => DataRow(
              cells: <DataCell>[
                DataCell(Text(element)),
              ],
            )),
          )
              .toList()
        )
      ],
    )
  ),
  bottomNavigationBar: NavBarWidget(index: 0,),
);
}

【问题讨论】:

  • 能否将错误添加到问题中?
  • 我做到了。它说“方法 'getStringList' 在 null 上被调用”。
  • 你可以避免在 initstate 中使用异步代码
  • 添加到 Kadri 的评论中:当您在 build 中调用 getStringList 时,您的 sp 为空,因为您在 SharedPreferences.getInstance().then(...) 中的代码异步运行。

标签: flutter sharedpreferences loading


【解决方案1】:

只是一个未经检验的猜测,但我认为 sp.getStringList('toprun') 返回一个承诺.. 所以你必须等待(等待)它或使用 futureBuilder.. 正如我所说,这是一个猜测,但调用 .map on未来可能会导致错误

编辑:我测试了它,这不是问题。正如@kadri-nadir 所说,问题在于 initState 并不适用于任何东西。所以在调用 build--method 时 sp 仍然为 null ......以下对我有用:

class _MyAppState2 extends State<MyApp2> {
  List<String> toprun = ["181","103","90","0","0","0","0","0","0","0"];

  @override
  void initState(){
    SharedPreferences.getInstance().then((SharedPreferences shared){
      shared.setStringList('toprun', toprun);
    });      //Setting Data in my sp
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Title'),
        backgroundColor: Colors.redAccent,
      ),
      body: Padding(
          padding: EdgeInsets.fromLTRB(30.0, 40.0, 30.0, 0.0),
          child:
          FutureBuilder<SharedPreferences>(future: SharedPreferences.getInstance(),
            builder: (BuildContext context, AsyncSnapshot<SharedPreferences> snapshot) {
              if (snapshot.hasData) {
                return Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      DataTable(
                          columns: [
                            DataColumn(label: Text('Results')),
                          ],
                          rows:
                          snapshot.data.getStringList(
                              'toprun') // Get data I previously saved in my sp
                              .map(
                            ((element) =>
                                DataRow(
                                  cells: <DataCell>[
                                    DataCell(Text(element)),
                                  ],
                                )),
                          )
                              .toList()
                      )
                    ]);
              }
              return Text('No data');
            })
      ),
    );
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2018-10-03
    • 2023-03-23
    • 2018-10-02
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多