【问题标题】:Implement verification user exist实现验证用户存在
【发布时间】:2021-06-01 04:54:55
【问题描述】:

我想检查一下用户是否已经填写了注册表:

这是我的 connectionState 代码:

class LandingPage extends StatelessWidget {

//  final Geolocator _geolocator = Geolocator()..forceAndroidLocationManager;

  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<AuthBase>(context, listen: false);
    return StreamBuilder<User>(
      stream: auth.onAuthStateChanged,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.active) {
          User user = snapshot.data;
          if (user == null) {
            return SignInPage();
          } else {
//            _geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best)
            MatchEngine.instance.initialise(user.uid);
            return Chat();
          }
        } else {
          return Scaffold(
            body: MyAppsCircularProgressIndicator(title: "MyApp",),
          );
        }
      },
    );
  }
}

此代码适用于连接状态。

我想在第一个代码中添加:

if (not signed in) {
  show sign in page
} else {
  if (not registered)
    show register page
  else 
    show home page
}

StreamBuilder(
  stream: auth.authStateChanges()
  builder: (_, snapshot) {
    // check connectionState too
    if (snapshot.hasData) {
      StreamBuilder(
        stream: database.userData() // this is a stream you create that reads from `userData/$uid` or similar
        builder: (_, snapshot) {
          if (snapshot.hasData) {
            return HomePage()
          } else {
            return RegisterPage()
          }
        }
      )
    } else {
      return SignInPage()
    }
  }
)

我想将最后一个代码添加到上一个代码中,以获得我的连接状态 + 重定向到 RegisterPage。

我尝试了一切,但无济于事......有人可以帮助我吗?谢谢

【问题讨论】:

    标签: flutter google-cloud-firestore google-signin


    【解决方案1】:

    您可以使用提供程序包,然后创建一个包含以下代码的单独文件。我个人使用它,效果很好。

    class Wrapper extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final user = Provider.of<User>(context);
    
        if (user == null) {
          return SignIn();
        } else {
          return Dashboard();
        }
      }
    }
    

    在您构建材质应用程序的 main.dart 文件中。将包装器(或任何你命名的)小部件改为如下所示。

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return FutureBuilder(
          // Initialize FlutterFire
          future: Firebase.initializeApp(),
          builder: (context, snapshot) {
    
            // Check for errors
            if (snapshot.hasError) {
              return ErrorPage();
            }
    
            // Show Application
            if (snapshot.connectionState == ConnectionState.done) {
              return StreamProvider<Help4YouUser>.value(
                value: AuthService().user,
                child: MaterialApp(
                  debugShowCheckedModeBanner: false,
                  home: Wrapper(),
                ),
              );
            }
    
            // Initialization
            return LoadingWidget();
          },
        );
      }
    }
    

    任何需要澄清的请评论

    【讨论】:

    • 您好,我已经使用了提供程序,并且我的重定向方法效果很好,我在您的代码中没有看到重定向到注册页面。注册页面是你的错误页面?我不想加载我的主页面并将代码放在我的登录页面中
    • @rpz 我不确定我是否理解正确。注册页面是在应用程序内创建的自定义页面吗?您是否在应用程序中使用谷歌登录。请让我知道这 2 个问题,我可能会为您提供进一步的帮助。
    • 我使用谷歌连接,我希望一旦用户通过谷歌进行身份验证,如果用户是新用户,他会去注册页面,如果他不是新用户,他会去家。而且我想保留我现有的代码(第一个),它允许在您理解的主页或登录页面上重定向应用程序的打开?谢谢
    • 我喜欢在第一个代码中实现第二个代码。如果连接处于活动状态,则返回主页,如果未处于活动状态,则转到连接,并在通过 google 验证后,如果有新的注册页面,如果已经存在,则返回主页。
    • @rpz 如果您使用 google 登录,那么我建议您在身份验证代码中进行身份验证,如果用户身份验证成功,您可以做的是创建云 Firestore 文档为用户。在您实现之后,您可以在如果用户 uid 和文档 id 不匹配然后转到您的注册页面,如果用户 uid 和文档 id 匹配然后转到您的主页,我认为这应该可以解决问题.如果你想帮助实现这个想法,我可以帮助你。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多