FirebaseAuth.instance.onAuthStateChanged由于某种原因不断被重新触发

时间:2020-05-30 19:51:46

标签: firebase dart firebase-authentication

我有以下代码用于设置用户的身份验证。我已经读过(here,该流将在以下四点触发:

  1. 注册收听者之后
  2. 用户登录后
  3. 当前用户退出时
  4. 当前用户更改时

它确实在1/2/3/4之后触发,但是在上述任何一种都不发生时也会触发。我的代码中有错误执行的东西吗?

我想知道是否每次使用FirebaseAuth相关功能(例如FirebaseAuth.instance.currentUser()时)都会触发流?

问题: 当我单击动态链接并且应用程序关闭时,它会很好地打开应用程序。该流将流发送到MainMenu()屏幕。 MainMenu()屏幕持续闪烁,好像重新启动一样。仅当应用程序关闭并通过动态链接打开时,才会发生这种情况。如果该应用程序在后台运行并进入前景,则可以正常运行。与我的应用程序接收动态链接相关的代码在下面的主要代码之后。

bool dataLoaded = false;
bool loadingProfile = false;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<UserData>(
      create: (BuildContext context)=>UserData(),
      child: MaterialApp(
        title: 'MyApp',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primarySwatch: Colors.deepOrange,
        ),
        home: Scaffold(
          backgroundColor: mainYellow,
          body: HomePage(),
        ),
      ),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  @override
  void initState() {
    super.initState();
    if (DEBUG) print ('-----   In Main.dart Homepage   -----');
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<FirebaseUser> (
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, snapshot) {
        if (DEBUG) print('>>... Stream triggered ...<<');
        bool loggedIn = false;
        bool emailVerified = false;
        if (snapshot.connectionState==ConnectionState.active) {
          if (snapshot.hasData){
            loggedIn = true;
            emailVerified = snapshot.data?.isEmailVerified;
            if (!emailVerified==null) emailVerified = false;
            if (loggedIn && !dataLoaded && !loadingProfile) {
              if(DEBUG) print('1 - Loading Profile commenced...');
              loadingProfile = true; // becomes false in LoadProfile method in data class
              _loadProfileOfUser(emailVerified);
            }
            if(DEBUG) print('LoggedIn: $loggedIn <-> EmailVerified: $emailVerified \n<->dataLoaded: $dataLoaded <->loadingProfile: $loadingProfile');
            return !dataLoaded && loadingProfile
                ? Center(child: CircularProgressIndicator(backgroundColor: mainOrange,))
            :loggedIn
                ? emailVerified
                    ? MainMenu()
                    : SignInSignOnScreen()
                : SignInSignOnScreen();
          }
          return SignInSignOnScreen();
        }
        return CircularProgressIndicator();
      },
    );
  }

  _loadProfileOfUser(bool emailVerified) async {
    if(DEBUG) print('2 - In loading profile function...');
    if (emailVerified && !dataLoaded) await Provider.of<UserData>(context).loadProfile(context);
    dataLoaded = true;
    if(DEBUG) print('DataLoaded set to true');
  }
}

}

用于接收动态链接的代码:

@override
  void initState() {
    super.initState();
    if (DEBUG) print ('-----   In Main Menu   -----');
    initDynamicLinks();
  }
void initDynamicLinks() async {
    if(DEBUG) print('---- CHECKING FOR DYNAMIC LINKS');
    final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
    final Uri deepLink = data?.link;

    //App is closed - THIS KEEPS GETTING RETRIGGERED
    if (deepLink != null) {
      if (DEBUG) print('Path: '+deepLink.path);
      if (DEBUG) print('Scheme: '+deepLink.scheme);
      if (DEBUG) print('Query: '+deepLink.query);
      if (DEBUG) print('siteID: '+deepLink.queryParameters['siteID']);
      if (DEBUG) print('ownerID: '+deepLink.queryParameters['ownerID']);
      Provider.of<UserData>(context).downloadSite(deepLink.queryParameters['ownerID'], deepLink.queryParameters['siteID']);
      //Navigator.pushNamed(context, deepLink.path);
    }

//App is in the background        
FirebaseDynamicLinks.instance.onLink(
            onSuccess: (PendingDynamicLinkData dynamicLink) async {

              final Uri deepLink = dynamicLink?.link;
              if (deepLink != null) {
                if (DEBUG) print('Path: '+deepLink.path);
                if (DEBUG) print('Scheme: '+deepLink.scheme);
                if (DEBUG) print('Query: '+deepLink.query);
                if (DEBUG) print('siteID: '+deepLink.queryParameters['siteID']);
                if (DEBUG) print('ownerID: '+deepLink.queryParameters['ownerID']);
                Provider.of<UserData>(context).downloadSite(deepLink.queryParameters['ownerID'], deepLink.queryParameters['siteID']);
                //    Navigator.pushNamed(context, deepLink.path);
              }
            },
            onError: (OnLinkErrorException e) async {
              print('onLinkError');
              print(e.message);
            }
        );
      }

0 个答案:

没有答案