【问题标题】:How can i show some loading screen or splash screen while flutter application loads up如何在颤振应用程序加载时显示一些加载屏幕或启动画面
【发布时间】:2021-01-26 12:01:28
【问题描述】:

我最近一直在开发一个应用程序。我想检查用户是否已登录并在我的应用程序加载时得到验证。所以我创建了一个 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();
  }
}

这工作正常,但问题是它首先闪烁登录页面,然后如果用户已登录并经过验证,它会将我带到主页,但如果用户未登录,它就可以正常工作see gif image here

【问题讨论】:

  • 你使用 bloc 吗?
  • 其实没有。我对此一无所知..我想我必须看看它。
  • 是的,在大项目中它非常有帮助,如果你想学习它,谷歌推荐它使用 bloc 包(稍微不那么复杂,它的代码是可以理解的)并学习 bloc 包的使用这个网站bloclibrary.dev/#你可以做你上面提到的,没有错误,很容易使用 bloc
  • 感谢您的建议。我只有一个查询。我现在可以在我的项目中使用它还是我完全需要更改项目的结构?
  • 它(bloc)需要时间来理解它需要自己的更改和属性(通常每个部分需要 30 或 40 行代码)但是当你这样做时你会熟悉它并从那一刻对您来说很容易,并且很容易将其放入应用程序中,只需 1 或 2 行代码即可在应用程序中使用它

标签: flutter authentication dart flutter-layout


【解决方案1】:

由于处理逻辑的方式,它可能会显示登录页面。您应该在 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();
  }
}

【讨论】:

  • 我尝试了第一种方法,但它给我带来了错误,例如---这个 Overlay 小部件无法标记为需要构建,因为框架已经在构建小部件的过程中。仅当其祖先之一当前正在构建时,小部件才能在构建阶段标记为需要构建。这个例外是允许的,因为框架在子组件之前构建父小部件,这意味着将始终构建脏后代。否则,框架可能不会在此构建阶段访问此小部件。调用 setState() 或 markNeedsBuild() 的小部件是:
  • 我犯了一个错误 super.initState();先来
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2013-05-28
  • 2021-04-09
  • 2022-01-25
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多