Я создаю страницу профиля в своем приложении для пользователей, которые могут входить в систему и выходить из нее, используя свой собственный номер учетной записи и код доступа. Я использую SharedPreference для хранения данных на локальных устройствах, включая логическое значение logined, для которого будет установлено значение true после входа пользователей в систему (по умолчанию - false). Вот и проблема. Я хочу показывать пользователям их собственную страницу профиля каждый раз, когда они переходят на эту страницу, без повторного перехода на страницу входа после входа в систему. Итак, прежде чем я создам эту страницу, я должен проверить, является ли переменная 'logined' на 'true' или «ложь». Если это правда, перейдите на страницу профиля. Если false, показать страницу входа. Но на самом деле страница входа в систему всегда отображается до того, как функция LoginedCheck (которая используется для проверки переменной «зарегистрирован» и навигации) выполнит свою работу. Откроется страница входа в систему, а затем быстро перейдет на страницу профиля. Я пробовал использовать «задержку», чтобы дождаться LoginedCheck (), но экран станет черным до создания страницы профиля. Есть идеи по решению проблемы? Например, спасибо.
Метод сборки:
Widget build(BuildContext context) {
LoginedCheck();
return Scaffold(
resizeToAvoidBottomPadding: false,
body: Stack(
children: <Widget>[
Container(
height: double.infinity,
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFF73AEF5),
Color(0xFF61A4F1),
Color(0xFF478DE0),
Color(0xFF398AE5),
],
stops: [0.1,0.4,0.7,0.9],
)),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
height: 10,
),
Icon(
Icons.account_circle,
size: 150.0,
),
SizedBox(height: 30),
Container(
width: 300,
child: Theme(
data: ThemeData(
primaryColor: Colors.white,
primaryColorDark: Colors.yellowAccent,
),
child: TextField(
controller: _LtextFieldAccount,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: '請輸入帳號',
prefixIcon: const Icon(Icons.person)),
)),
),
SizedBox(height: 20),
Container(
width: 300,
child: Theme(
data: ThemeData(
primaryColor: Colors.white,
primaryColorDark: Colors.yellowAccent,
),
child: TextField(
controller: _LtextFieldID,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: '請輸入密碼',
prefixIcon: const Icon(Icons.lock)),
)),
),
SizedBox(height: 30),
RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25.0)),
elevation: 4.0,
color: Colors.white,
child: Container(
padding: EdgeInsets.only(
left: 10,right: 10,top: 10,bottom: 10),
child: Text(
'登入',
style:
TextStyle(fontSize: 25,color: Colors.blueAccent),
),
),
onPressed: Login,
),
SizedBox(height: 20),
RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25.0)),
elevation: 4.0,
color: Colors.white,
child: Container(
padding: EdgeInsets.only(
left: 10,right: 10,top: 10,bottom: 10),
child: Text(
'新用戶註冊',
style:
TextStyle(fontSize: 25,color: Colors.blueAccent),
),
),
onPressed: (){
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => RegisterPage()));
})
],
),
),
),
],
),
bottomNavigationBar: BottomNavigationBar(
onTap: onTabTapped,
currentIndex: _currentIndex, //thiswillbesetwhenanewtabistapped
items: [
new BottomNavigationBarItem(
icon: new Icon(Icons.school),
title: new Text('大學'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.directions_subway),
title: new Text('交通'),
),
new BottomNavigationBarItem(
icon: new Icon(Icons.person),
title: new Text('個人'),
)
],
),
);
}
Функция LoginedCheck ():
Future LoginedCheck() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
bool logined = prefs.getBool(_StorageLogined) ?? false;
int GetUserNum = prefs.getInt(_StorageUserNum) ?? 0;
if(logined == true) {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ShowProfile(UserNum: GetUserNum,)));
}
}