我最近一直在开发一个应用程序。我想检查用户是否已登录并在我的应用加载时通过验证。因此,我创建了一个Wrapper类来检查用户是否已登录并得到验证。然后相应地,我将向他们显示登录屏幕或主屏幕。
我在Main.dart中分配了home:Wrapper()。
之后,我将包装类设置为
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
// checking if there is user and the user is verified
bool _isAuth() {
if (user != null && user.isVerified) {
return true;
}
return false;
}
return _isAuth() ? MainScreen() : Authenticate();
}
}
这可以正常工作,但是问题是,如果用户已登录并经过验证,首先闪烁登录页面,然后将我带到主页,但是如果用户未登录{{3 }}
答案 0 :(得分:0)
由于您处理逻辑的方式,它可能显示登录页面。您应该在initState
中而不是在build方法中执行此操作。有两种方法可以执行此操作,您既可以将包装器用作重定向类,也可以像以前已经使用过的那样使用build方法来切换视图。
第一种方法(使用重定向)
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
@override
void initState() {
super.initState();
final user = Provider.of<User>(context, listen: false);
var _isAuth = user != null && user.isVerified;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => _isAuth ? MainScreen() : Authenticate()),
);
}
@override
Widget build(BuildContext context) {
return CircularProgressIndicator();
}
}
第二种方法(使用构建方法):
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
bool _isAuth = false;
bool _isLoading = true;
@override
void initState() {
super.initState();
final user = Provider.of<User>(context, listen: false);
setState(() {
_isAuth = user != null && user.isVerified;
_isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return _isLoading
? CircularProgressIndicator()
: _isAuth
? MainScreen()
: Authenticate();
}
}