如何解决Flutter:动态链接未启动应用程序
我正在使用 firebase 动态链接在我的应用中打开电子邮件验证链接,但不幸的是,点击该链接时该链接没有启动应用。
到目前为止我所做的
创建新用户时,会通过电子邮件发送链接以供验证:
if(firebaseUser != null && !firebaseUser.emailVerified){
await createUserInDatabaseIfNew(firebaseUser);
var actionCodeSettings = auth.ActionCodeSettings(
url: 'https://muslimcoloc.page.link/?email=${firebaseUser.email}',dynamicLinkDomain: "muslimcoloc.page.link",androidInstallApp: true,androidMinimumVersion: "12",androidPackageName: "com.app.muslim_coloc",iOSBundleId: "com.muslim_coloc.ios",handleCodeInApp: true,);
await firebaseUser.sendEmailVerification(actionCodeSettings);
}
我在 firebase 控制台中获得了 dynamicLinkDomain :
然后,我使用 firebase dynamic links package 处理 main.dart
文件中链接的接收:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MyApp(),);
}
class MyApp extends StatelessWidget {
MyApp({Key key,}) : super(key: key);
@override
Widget build(BuildContext context) {
return AppView();
}
}
class AppView extends StatefulWidget {
const AppView({
Key key,}) : super(key: key);
@override
_AppViewState createState() => _AppViewState();
}
class _AppViewState extends State<AppView> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
this.initDynamicLinks();
}
}
void initDynamicLinks() async {
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
FirebaseAuth auth = FirebaseAuth.instance;
//Get actionCode from the dynamicLink
var actionCode = deepLink.queryParameters['oobCode'];
try {
await auth.checkActionCode(actionCode);
await auth.applyActionCode(actionCode);
// If successful,reload the user:
auth.currentUser.reload();
} on FirebaseAuthException catch (e) {
if (e.code == 'invalid-action-code') {
print('The code is invalid.');
}
}
if (deepLink != null) {
Navigator.pushNamed(context,deepLink.path);
}
},onError: (OnLinkErrorException e) async {
print('onLinkError');
print(e.message);
}
);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
Navigator.pushNamed(context,deepLink.path);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(...)
}
当我点击电子邮件的链接时,应用程序和浏览器都不会启动。这是发生的事情:
它尝试在浏览器上启动一些东西,但随后又返回到 gmail。
但是,如果我点击桌面浏览器中的链接,它工作正常,电子邮件已通过验证。
我很难理解这是怎么回事。我做事的方式有问题吗?
解决方法
您应该根据文档编写一个函数来处理您的动态链接,这对我在当前使用的应用程序中有效:
void handleDynamicLinks() async {
///To bring INTO FOREGROUND FROM DYNAMIC LINK.
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLinkData) async {
await _handleDeepLink(dynamicLinkData);
},onError: (OnLinkErrorException e) async {
print('DynamicLink Failed: ${e.message}');
return e.message;
},);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(data);
}
// bool _deeplink = true;
_handleDeepLink(PendingDynamicLinkData data) async {
final Uri? deeplink = data.link;
if (deeplink != null) {
print('Handling Deep Link | deepLink: $deeplink');
}
}
并在 initState 中:
@override
void initState() {
handleDynamicLinks();
super.initState();
}
在您的主页中编写此逻辑。不在void(main..etc)
但是在那之后的第一个小部件中,它应该可以工作。
另外,请务必仔细检查您的软件包名称,即 com.example.yourAwesomeApp123
,它可以让整个系统知道在按下动态链接时要打开哪个应用。