#flutter #authentication #sharedpreferences
#flutter #аутентификация #общие предпочтения
Вопрос:
Я создавал приложение с помощью flutter и использовал пакет shared_preferences, и на этапе аутентификации я сталкиваюсь с проблемой, когда при создании приложения пользователь входит в систему, и когда я выхожу из системы и перезапускаю приложение после его завершения, оно по-прежнему отображается на главной странице, вот мой код
главный.дротик
bool checkingKey;
Future<bool> checkKey() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool checkingKey=prefs.containsKey("jwt");
print("$checkingKey");
return checkingKey;
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
Paint.enableDithering = true;
await checkKey().then((value){
checkingKey=value;
});
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// bool check=checkKey().then((bool value) => true);
print("hello=$checkingKey");
return MaterialApp(
home: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
),
child: Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
color: Color(0xffccffcc),
child:checkingKey==false?LoginPage():mainPage()
),
),
),
routes: <String,WidgetBuilder>{
'/home':(BuildContext context)=>mainPage(),
'/login':(BuildContext context)=>LoginPage(),
}
);
}
}
login_signup_Auth.dart для входа в систему
Future<void> attemptLogIn(String username, String password,BuildContext context) async {
///?final storage =parent_inherit.of(context);
///?var verify=storage.verify;
SharedPreferences prefs = await SharedPreferences.getInstance();
print("$username $password");
final http.Response res = await http.post(
"https://green-earth.herokuapp.com/signin",
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
// 'authorization':'Bearer '
},
body: jsonEncode(<String, String>{
"email": username,
"password": password
}),
);
if(res.statusCode == 200) {
prefs.setString('jwt',res.body);
var value=prefs.getString('jwt');
print("storage= ${value.isEmpty}");
Navigator.of(context).pushNamed('/home');
}
else{
return _showMyDialoglogin(context,res.statusCode);
}
}
void logoutOutOfApp(BuildContext context) async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.clear();
Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
}
При второй сборке без каких-либо изменений переменной checking key возвращается ‘true’, чего я не знаю, как это может быть возможно!!!!!!
Я не понимаю, что я делаю неправильно, также, если вы видите какую-либо другую проблему, которая может сделать программу эффективной или любой другой код, который должен быть использован. пожалуйста, сообщите
Большое Вам спасибо!!
Ответ №1:
Почему вы все усложняете ? Ваша main.dart
банка просто выглядит так
bool checkingKey;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Paint.enableDithering = true;
var prefs = await SharedPreferences.getInstance();
checkingKey = prefs.containsKey("jwt");
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print("hello=$checkingKey");
return MaterialApp(
home: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
),
child: Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
color: Color(0xffccffcc),
child: !checkingKey ? LoginPage() : mainPage(),
),
),
),
routes: <String,WidgetBuilder>{
'/home':(BuildContext context) => mainPage(),
'/login':(BuildContext context) => LoginPage(),
},
);
}
}
Комментарии:
1. Я думаю , это сработало . Большое вам спасибо, но можете ли вы сказать, что я делал неправильно, даже если это было сложно, но вы видели что-то неправильное? Пожалуйста, скажите, это действительно поможет мне выявить проблемы в моем коде. И еще раз спасибо
2.
bool checkingKey
рассматривается как глобальная переменная.void main
это ваша точка входа в приложение. В строкеcheckingKey = prefs.containsKey("jwt");
ваша глобальная переменная инициализируется для всей области вашего приложения. ТакимMyApp
образом, класс будет просто использовать переменную с ее текущим значением3. о! Итак, это происходит только для dart или для других языков?