共享首选项:如果用户已经访问过应用程序,我如何将用户发送到主屏幕?
shared preferences : how can i send user to homescreen if user visited app already?
我有一个应用程序,我在其中使用共享首选项包来存储数据。我希望如果用户是第一次访问应用程序,则显示 WelcomeScreen,否则显示 HomeScreen。
我在按钮的 OnPressed 方法上调用了 shared_preferences 方法,但问题已经出现在欢迎屏幕上。我也使用了initSate,使用initSate也显示错误。
这是我没有 initSate 的代码,但因为我已经是欢迎屏幕,所以每次我回到同一个屏幕。
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
Widget build(BuildContext context) {
return FlatButton(
onPressed: () async {
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName );
}
else{
Navigator.pushReplacementNamed(
context, welcomeScreen.routeName);
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Continue',
style: TextStyle(
fontSize: 24,
color: Theme.of(context)
.primaryTextTheme
.bodyText2
.color,
),
),
Icon(
Icons.arrow_right,
size: 30,
color:
Theme.of(context).primaryTextTheme.bodyText2.color,
),
],
),
);
}
}
这是我使用 initSate 但显示错误的代码:
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName);
}
else{
Navigator.pushReplacementNamed(
context, WelcomeScreen.routeName);
}
}
@override
Widget build(BuildContext context) {
return Container(); // more same code
}
}
这是因为您的 visitingMethod
是异步的。我的建议:
class _WelcomeScreenState extends State<WelcomeScreen> {
// create a variable to control build
bool loadWelcome = false;
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await getVisitingUser();
setVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(context, HomeScreen.routeName);
} else {
setState(() {
loadWelcome = true;
});
}
}
@override
Widget build(BuildContext context) {
return (loadWelcome? (
// here the welcome widgets tree
) : Container())
}
}
我有一个应用程序,我在其中使用共享首选项包来存储数据。我希望如果用户是第一次访问应用程序,则显示 WelcomeScreen,否则显示 HomeScreen。 我在按钮的 OnPressed 方法上调用了 shared_preferences 方法,但问题已经出现在欢迎屏幕上。我也使用了initSate,使用initSate也显示错误。
这是我没有 initSate 的代码,但因为我已经是欢迎屏幕,所以每次我回到同一个屏幕。
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
Widget build(BuildContext context) {
return FlatButton(
onPressed: () async {
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName );
}
else{
Navigator.pushReplacementNamed(
context, welcomeScreen.routeName);
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Continue',
style: TextStyle(
fontSize: 24,
color: Theme.of(context)
.primaryTextTheme
.bodyText2
.color,
),
),
Icon(
Icons.arrow_right,
size: 30,
color:
Theme.of(context).primaryTextTheme.bodyText2.color,
),
],
),
);
}
}
这是我使用 initSate 但显示错误的代码:
class WelcomeScreen extends StatefulWidget {
@override
_WelcomeScreenState createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await Provider.of<MainProvider>(context, listen: false).getVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(
context, HomeScreen.routeName);
}
else{
Navigator.pushReplacementNamed(
context, WelcomeScreen.routeName);
}
}
@override
Widget build(BuildContext context) {
return Container(); // more same code
}
}
这是因为您的 visitingMethod
是异步的。我的建议:
class _WelcomeScreenState extends State<WelcomeScreen> {
// create a variable to control build
bool loadWelcome = false;
@override
void initState() {
// TODO: implement initState
super.initState();
visitingMethod();
}
void visitingMethod() async{
bool visitingFlag = await getVisitingUser();
setVisitingUser();
if(visitingFlag == true){
Navigator.pushReplacementNamed(context, HomeScreen.routeName);
} else {
setState(() {
loadWelcome = true;
});
}
}
@override
Widget build(BuildContext context) {
return (loadWelcome? (
// here the welcome widgets tree
) : Container())
}
}