共享首选项键值未更改

Shared Preferences key value not changing

我想编写代码,在第一次使用应用程序时将用户引导至欢迎页面 运行。用户登录后,应用程序的任何后续启动都会引导用户登录,跳过欢迎页面。似乎当我尝试在登录时设置我的密钥值时,它并没有改变,因为在登录后,关闭应用程序并再次启动它仍然会进入欢迎页面。我该如何解决?我不确定是初始化问题还是登录时的值设置问题。

这是我的应用程序的初始化:

import 'package:screens/welcomepages/signup_or_login.dart';
import 'package:screens/welcomepages/welcome.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:config/theme.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      statusBarBrightness: Brightness.dark));
  runApp(MyApp(prefs: await _prefs));
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key, this.title, required this.prefs})
      : super(key: key);
  final String? title;
  final SharedPreferences prefs;

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SharedPreferences prefs;

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

  Future<void> initializePreference() async {
    prefs = await SharedPreferences.getInstance();
    setState(() {
      prefs.setBool("hasLoggedIn", false);
    });
  }

  @override
  Widget build(BuildContext context) {
    if (prefs.getBool("hasLoggedIn") == false) {
      return MaterialApp(
        theme: theme(),
        debugShowCheckedModeBanner: false,
        home: Welcome(prefs: prefs),
      );
    }
    return MaterialApp(
      theme: theme(),
      debugShowCheckedModeBanner: false,
      home: SignUpOrLogIn(prefs: prefs),
    );
  }
}

这是我登录页面的相关部分

import 'package:services/auth/auth_service.dart';
import 'package:widgets/text_fields_widgets/email_textfield.dart';
import 'package:widgets/text_fields_widgets/password_textfeild.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Login extends StatefulWidget {
  const Login({Key? key, required this.prefs}) : super(key: key);
  final SharedPreferences prefs;

  @override
  _LoginState createState() => _LoginState(prefs);
}

class _LoginState extends State<Login> {
  late final SharedPreferences prefs;
  _LoginState(SharedPreferences prefs);

  Future<void> initializePreference() async {
    prefs = await SharedPreferences.getInstance();
  }

  @override
  void initState() {
    super.initState();
    initializePreference().whenComplete(() {
      setState(() {
        prefs.getBool("isFirstRun");
      });
    });
  }

 @override
  Widget build(BuildContext context) {
    Material btnLogin = loginBTN(context);
    return Scaffold(
      .....
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: btnLogin,
      )
    }

  Material loginBTN(BuildContext context) {
    // ignore: unused_local_variable
    final btnLogin = Material(
      elevation: 5,
      borderRadius: BorderRadius.circular(30),
      color: Theme.of(context).primaryColor,
      child: MaterialButton(
        padding: const EdgeInsets.fromLTRB(20, 15, 20, 15),
        minWidth: MediaQuery.of(context).size.width,
        onPressed: () async {
          setState(() {
            prefs.setBool("hasLoggedIn", true);
          });
          setState(
            () => loadingAnimation = true,
          );
          await Future.delayed(const Duration(seconds: 1));
          setState(
            () => loadingAnimation = false,
          );
          await Authservice().logInMethod(
              emailController.text, passwordController.text, context, _formKey);
        },
        child: loadingAnimation
            ? const CircularProgressIndicator(
                color: Colors.white,
              )
            : const Text(
                "Log in",
                textAlign: TextAlign.center,
                style: TextStyle(fontSize: 24, color: Colors.white),
              ),
      ),
    );
    return btnLogin;
  }
}

很抱歉这篇文章太长了,已尝试将其缩短以仅提供相关内容。

试试这个兄弟

  if (prefs.getBool("hasLoggedIn") == null || prefs.getBool("hasLoggedIn") == false) {
      return MaterialApp(
        theme: theme(),
        debugShowCheckedModeBanner: false,
        home: Welcome(prefs: prefs),
      );
    }

您正在 initState() 中调用 initializePreference(),并且该函数将 hasLoggedIn 设置为 false。因此,即使您在登录页面将其设置为 true,在重新启动应用程序时,它也会再次设置为 false.