基于 futureBuilder 的 Flutter MaterialApp 主页

Flutter MaterialApp home based on futureBuilder

当我的应用程序启动时,它会检测用户是否登录(使用 firebase),并根据此检查显示主页或登录页面。到现在一切都很好,但我想再加一层。

用户可以以普通用户或管理员身份登录。 所以不仅要检查认证状态,还要检查用户的“级别”,根据用户级别显示不同的页面。

我通过对 firestore 数据库的查询获得了用户级别,所以这是一个 Future。 这是我正在使用的代码:

  final usersCollection = FirebaseFirestore.instance.collection('users');
  User loggedUser = FirebaseAuth.instance.currentUser;
  Future<InfoUtente> userInfo;
  String livelloLogin;

  // here I get the user from the firestore database, based on the authenticated user id
  Future<InfoUtente> fetchInfoUtente() async {
    final response = await usersCollection
        .where(
          'uid',
          isEqualTo: loggedUser.uid,
        )
        .get();
    return InfoUtente.fromFireStore(response.docs.first);
  }
  
  // here I return the page based on the user authentication "level"
  Future<Widget> widgetChoice() async {
    if (!isLogged)
      return LoginNewPage();
    else {
      userInfo.then(
        (value) {
          livelloLogin = value.loginLevel;
          if (livelloLogin == 'struttura')
            return StrutturaPage();
          else
            return MainPage();
        },
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      
      // the homepage of the material app is a future builder
      home: FutureBuilder(
        future: widgetChoice(),
        builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
          if (!widget.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return widget.data;
        },
      ),
    );
  } 

有些地方不对,因为它总是显示循环进度指示器。 我究竟做错了什么? 这是正确的做法还是我完全错了?

如果我是对的,你必须这样调用 future 函数:

FutureBuilder(
        future: widgetChoice,

没有()

如果没有获取或找到任何数据,您的屏幕将无限期地卡在加载中。将构建器的实现更新为

builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
        if(widget.connectionState == ConnectionState.done){
          if (!widget.hasData) {
            return Center(
              child: Text('No Data exists')
            );
          }
          return widget.data;
        }
        return Center(
          child: CircularProgressIndicator(),
        );
      },

并将您的 widgetChoice 更新为

Future<Widget> widgetChoice() async {
    if (!isLogged)
      return LoginNewPage();
    else {
      var userInfo = await fetchInfoUtente();
      livelloLogin = userInfo.loginLevel;
      if (livelloLogin == 'struttura')
        return StrutturaPage();
      else
        return MainPage();
    }
  }