#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,
);
});
});
}
}