【问题标题】:Flutter Firestore check if user exists via StreamBuilder:Flutter Firestore 通过 StreamBuilder 检查用户是否存在:
【发布时间】:2021-11-23 08:51:10
【问题描述】:

我正在尝试通过 StreamBuilder 在我的应用中添加一个检查,以根据用户的文档是否存在于 Firestore 中向用户显示不同的屏幕。我的代码在技术上有效,但在热重载时,它会显示我的“AddUser”屏幕几秒钟,然后再转到我的“UserHomeScreen”。我想知道如何纠正这个问题,如果用户文档存在,“AddUser”屏幕根本不会显示我的“AddUser”屏幕。

这是我的代码:

class UserStream extends StatelessWidget {
  const UserStream({Key? key}) : super(key: key);
  

  @override
  Widget build(BuildContext context) {
    FirebaseAuth auth = FirebaseAuth.instance;
     String uid = auth.currentUser!.uid.toString();
    return StreamBuilder<dynamic>(
      stream: FirebaseFirestore.instance.collection('users').doc(uid).snapshots(),
      builder: (context, snapshot) {
        if (snapshot.hasData && snapshot.data!.exists) {
          return const UserHomeScreen();
        } else {
          return AddUser(youtubeLink: '', bio: '', bioLink: '', displayName: '', instaLink: '', profilePhoto: '', tiktokLink: '', username: '',);
        }
      },
    );
  }
}

【问题讨论】:

  • 这是一个非常糟糕的检查根逻辑的做法。
  • @BloodLoss 我尝试使用 Future 但无法正常工作。我也不想使用共享首选项。
  • 但这不是好的做法。不需要使用本地缓存来处理这个
  • @BloodLoss 那你推荐我用什么?

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

您可以像这样构建您的构建器:

builder: (context, snapshot) {
  if (snapshot.hasData) {
    if (snapshot.data!.exists){
      return const UserHomeScreen();
    } else {
      return AddUser(youtubeLink: '', bio: '', bioLink: '', displayName: '', instaLink: '', profilePhoto: '', tiktokLink: '', username: '',);
    }
  } else {
    return CircularProgressIndicator();
  }
},

这样,您在解析快照时显示CircularProgressIndicator。此时,您不知道您的数据是否存在。

一旦解决了快照并且您有信息,无论您的数据是否存在,您都可以显示相应的屏幕。

【讨论】:

  • 成功了!谢谢
【解决方案2】:

我认为您的解决方案不是一个好习惯。这是我的解决方案。

您必须创建一些启动/登陆屏幕来处理您的逻辑。

    class LandingPage extends StatefulWidget {
      @override
      _LandingPageState createState() => _LandingPageState();
    }
    
    class _LandingPageState extends State<LandingPage> {
     final FirebaseAuth auth = FirebaseAuth.instance;
     final FirebaseFirestore db = FirebaseFirestore.instance; 
    
      @override
      void initState() {
        super.initState();
        String? uid = auth?.currentUser?.uid;
        if(uid == null) {
          Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => AddUser(youtubeLink: '', bio: '', bioLink: '', displayName: '', instaLink: '', profilePhoto: '', tiktokLink: '', username: '',)));     
        } else {
          db.collection('users').doc(uid!).get().then((doc) {
          var user = doc.data();
    
          if(user != null) {
            Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => UserHomeScreen()));
          } else {
            Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => AddUser(youtubeLink: '', bio: '', bioLink: '', displayName: '', instaLink: '', profilePhoto: '', tiktokLink: '', username: '',)));       
          }
       }
   });
 }
}

 @override
  Widget build(BuildContext context) {
    return Scaffold(); // some loading UI
  }

【讨论】:

  • 嗯!谢谢人:)
猜你喜欢
  • 2021-12-29
  • 2018-03-16
  • 1970-01-01
  • 2021-10-23
  • 2021-09-15
  • 2018-12-09
  • 2018-07-12
  • 2021-08-21
相关资源
最近更新 更多