我有以下代码用于设置用户的身份验证。我已经读过(here,该流将在以下四点触发:
它确实在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);
}
);
}