Я пытаюсь создать учетную запись пользователя, но мой код работает только при горячем перезапуске приложения

#flutter #dart #sharedpreferences

#трепетать #дротик #общие предпочтения

Вопрос:

Я использую страницу входа в систему, и почти все готово. Теперь, что нужно, чтобы пользователь оставался в системе после очистки приложения в фоновом режиме. Я попробовал SharedPreference в flutter, это работает. Но это работает только при повторном запуске, а не при перезапуске. Может ли кто-нибудь помочь мне в этом?

Это класс SharedPreference

 import 'package:shared_preferences/shared_preferences.dart';

class HelperFunction {
  static String sharedPreferenceUserLoggedInKey = 'userLoggedIn';
  static String sharedPreferenceUserLoggedOutKey = 'userLoggedOut';
  static String sharedPreferenceUserSignedUpKey = 'userSignedUp';

  //saving data to sharedPreference
  static Future<bool> saveUserLoggedInSharedPreference(
      bool isUserLoggedIn) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.setBool(sharedPreferenceUserLoggedInKey, isUserLoggedIn);
  }

  static Future<bool> saveUserSignedUpSharedPreference(
      bool isUserSignUp) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.setBool(sharedPreferenceUserSignedUpKey, isUserSignUp);
  }

  static Future<bool> saveUserLoggedOutSharedPreference(
      bool isUserLoggedOut) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.setBool(
        sharedPreferenceUserLoggedOutKey, isUserLoggedOut);
  }


  //getting data to sharedPreference
  static Future<bool> getUserLoggedInSharedPreference() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.getBool(sharedPreferenceUserLoggedInKey);
  }

  static Future<bool> getUserLoggedOutSharedPreference() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.getBool(sharedPreferenceUserLoggedOutKey);
  }

  static Future<bool> getUserSignedUpSharedPreference() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return await prefs.getBool(sharedPreferenceUserSignedUpKey);
  }
}

  

Функция нажатия кнопки входа

 FlatButton(
onPressed:(){
HelperFunction.saveUserLoggedInSharedPreference(true);
        HelperFunction.saveUserSignedUpSharedPreference(false);
        HelperFunction.saveUserLoggedOutSharedPreference(false);
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(
            builder: (context) => DashBoard(),
          ),
        );
  
}
),


  

Кнопка регистрации нажата функция:

 FlatButton(
onPressed:(){
 HelperFunction.saveUserLoggedInSharedPreference(false);
          HelperFunction.saveUserSignedUpSharedPreference(true);
          HelperFunction.saveUserLoggedOutSharedPreference(false);
          Navigator.pop(context);
        }
}
)

  

Функция нажатия кнопки выхода из системы:

 FlatButton(
onPressed:(){

         HelperFunction.saveUserLoggedOutSharedPreference(true);
         HelperFunction.saveUserLoggedInSharedPreference(false);
         HelperFunction.saveUserSignedUpSharedPreference(false);
         Navigator.pop(context);
        }
}
)
  

Это моя основная функция

 void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light
      .copyWith(systemNavigationBarColor: Colors.black));

  runApp(
    DevicePreview(
      enabled: kReleaseMode,
      builder: (context) => FlashChat(),
    ),
  );
}

class FlashChat extends StatefulWidget {
  @override
  _FlashChatState createState() => _FlashChatState();
}

class _FlashChatState extends State<FlashChat> {
  bool isUserLoggedIn;
  bool isUserSignedUp;
  bool isUserLoggedOut;

  void getLoggedInStatus() async {
    await HelperFunction.getUserLoggedInSharedPreference().then((value) {
      isUserLoggedIn = value;
      print('isUserLoggedIn = $isUserLoggedIn');
    });
  }

  void getSignedUpStatus() async {
    await HelperFunction.getUserSignedUpSharedPreference().then((value) {
      isUserSignedUp = value;
      print('isUserSignedUp = $isUserSignedUp');
    });
  }

  void getLoggedOutStatus() async {
    await HelperFunction.getUserLoggedOutSharedPreference().then((value) {
      isUserLoggedOut = value;
      print('isUserLoggedOut = $isUserLoggedOut');
    });
  }

  @override
  void initState() {
    getLoggedInStatus();
    getSignedUpStatus();
    getLoggedOutStatus();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (context, constraints) {
      return OrientationBuilder(builder: (context, orientation) {
        SizeConfig().init(constraints, orientation);
        return MaterialApp(
          home: isUserLoggedIn == true
              ? DashBoard()
              : isUserSignedUp == true
                  ? LoginScreen()
                  : isUserLoggedOut == true ? LoginScreen() : WelcomeScreen(),
          debugShowCheckedModeBanner: false,
        );
      });
    });
  }
}
  

Ответ №1:

После долгих поисков я нашел ответ на этот вопрос. Поместив значение внутри setState, я решил свою проблему.

 import 'package:firebase_core/firebase_core.dart';
import 'package:flash/helper/helper_function.dart';
import 'package:flash/screens/dash_board_screen.dart';
import 'package:flash/screens/forgot_password_screen.dart';
import 'package:flash/screens/welcome_screen.dart';
import 'package:flash/size_configuration.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flash/screens/login_screen.dart';
import 'package:flash/screens/registration_screen.dart';
import 'package:flash/screens/chat_screen.dart';
import 'package:device_preview/device_preview.dart';
import 'package:flutter/services.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light
      .copyWith(systemNavigationBarColor: Colors.black));

  runApp(
    DevicePreview(
      enabled: kReleaseMode,
      builder: (context) => FlashChat(),
    ),
  );
}

class FlashChat extends StatefulWidget {
  @override
  _FlashChatState createState() => _FlashChatState();
}

class _FlashChatState extends State<FlashChat> {
  bool isUserLoggedIn;
  bool isUserSignedUp;
  bool isUserLoggedOut;

  @override
  void initState() {
    getLoggedInStatus();
    getSignedUpStatus();
    getLoggedOutStatus();
    super.initState();
  }

  void getLoggedInStatus() async {
    await HelperFunction.getUserLoggedInSharedPreference().then((value) {
      setState(() {
        isUserLoggedIn = value;
      });
      print('isUserLoggedIn = $isUserLoggedIn');
    });
  }

  void getSignedUpStatus() async {
    await HelperFunction.getUserSignedUpSharedPreference().then((value) {
      setState(() {
        isUserSignedUp = value;
      });
      print('isUserSignedUp = $isUserSignedUp');
    });
  }

  void getLoggedOutStatus() async {
    await HelperFunction.getUserLoggedOutSharedPreference().then((value) {
      setState(() {
        isUserLoggedOut = value;
      });
      print('isUserLoggedOut = $isUserLoggedOut');
    });
  }

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (context, constraints) {
      return OrientationBuilder(builder: (context, orientation) {
        SizeConfig().init(constraints, orientation);
        return MaterialApp(
          home: isUserLoggedIn == true
              ? DashBoard()
              : isUserSignedUp == true || isUserLoggedOut == true
                  ? LoginScreen()
                  : WelcomeScreen(),
          debugShowCheckedModeBanner: false,
        );
      });
    });
  }
}