如何在Flutter应用程序加载时显示一些加载屏幕或启动屏幕

时间:2020-10-12 07:26:06

标签: flutter authentication dart flutter-layout

我最近一直在开发一个应用程序。我想检查用户是否已登录并在我的应用加载时通过验证。因此,我创建了一个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 }}

1 个答案:

答案 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();
  }
}