【问题标题】:Flutter SharedPreferences non-nullable instance fieldsFlutter SharedPreferences 不可为空的实例字段
【发布时间】:2021-09-28 09:43:33
【问题描述】:

我想使用共享首选项来存储和显示值时遇到问题。在代码上,我需要创建公共类供下面的函数使用。 但是它会返回以下错误:

错误:必须初始化不可为空的实例字段“sharedPreferences”。 (not_initialized_non_nullable_instance_field at [login] lib/main.dart:32)

SharedPreferences 共享首选项; //线:32

这是我的完整代码。


import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:login/login_page.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Code Land",
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
      theme: ThemeData(
          accentColor: Colors.white70
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
   createState() => MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {

  SharedPreferences sharedPreferences;

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

  checkLoginStatus() async {
    sharedPreferences = await SharedPreferences.getInstance();
    if(sharedPreferences.getString("token") == null) {
      Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => LoginPage()), (Route<dynamic> route) => false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Code Land", style: TextStyle(color: Colors.white)),
        actions: <Widget>[
          FlatButton(
            onPressed: () {
              sharedPreferences.clear();
              sharedPreferences.commit();
              Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => LoginPage()), (Route<dynamic> route) => false);
            },
            child: Text("Log Out", style: TextStyle(color: Colors.white)),
          ),
        ],
      ),
      body: Center(child: Text("Main Page")),
      drawer: Drawer(),
    );
  }
}```

【问题讨论】:

    标签: flutter


    【解决方案1】:

    像这样改变这一行,让编译器知道你稍后会初始化它:

    late SharedPreferences sharedPreferences;
    

    【讨论】:

    • 这应该也可以。
    【解决方案2】:

    如果您不打算立即初始化 sharedPref,这应该可以解决问题。

    SharedPreferences? sharedPreferences;
    

    如果我没记错的话,自 2.2 起,Dart sound null 安全已在 Flutter 中默认启用。

    查看这篇文章以获得有关该主题的入门。

    https://dart.dev/null-safety

    【讨论】:

      【解决方案3】:

      来自 Dart 文档:“late 修饰符允许您在可能无法使用的地方使用不可为空的类型和 final,但会牺牲运行时检查。它还为您提供惰性初始化字段。" https://dart.dev/null-safety/understanding-null-safety

      你的SharedPreferences 声明应该有late 修饰符:

      late SharedPreferences sharedPreferences;
      

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 2023-01-07
        • 2021-07-06
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多