当应用程序已在运行且使用 Firebase 动态链接时导航不起作用
Posted
技术标签:
【中文标题】当应用程序已在运行且使用 Firebase 动态链接时导航不起作用【英文标题】:Navigation not working when the app is already running and Firebase Dynamic Links are used 【发布时间】:2020-07-19 12:44:22 【问题描述】:如果应用程序是使用动态链接打开的,我有这个加载器小部件,它检查动态链接并导航到/game
路由(gamePage()
小部件)。如果应用是手动打开的,它将导航到/home
路由。
当应用程序关闭然后通过动态链接打开时,我的代码可以正常工作。 但是当应用程序已经打开并且在主页上时,代码就不起作用了,因为上下文是空的。
Loader.dart
class Loader extends StatefulWidget
@override
_LoaderState createState() => _LoaderState();
class _LoaderState extends State<Loader>
Future<void> initDynamicLinks() async
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
print(deepLink);
if (deepLink != null)
Navigator.pushReplacementNamed(context, '/game'); //this works because app has just started
else
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async
final Uri deepLink = dynamicLink?.link;
if (deepLink != null)
print(context); // prints null
Navigator.pushReplacementNamed(context, '/game'); //this does not work because the app is already running and its on /home and context is null
,
onError: (OnLinkErrorException e) async
print('error Opening the link');
print(e.message);
);
Navigator.pushReplacementNamed(context, '/home'); // load home widget if there are no deep links
@override
void initState()
super.initState();
initDynamicLinks();
@override
Widget build(BuildContext context)
//Loading animation widget code
main.dart
void main()
runApp(MaterialApp(
initialRoute: "/load",
routes:<String, WidgetBuilder>
'/load': (context) => Loader(),
'/home': (context) => Home(),
'/game': (context) => gamePage(),
,
),
);
我是 Flutter 的新手,因此不胜感激。谢谢。
【问题讨论】:
【参考方案1】:是的,你是对的。没有上下文是行不通的。因此,每次深层链接调用时,您都需要提供上下文。
要实现这一点,请为管理深层链接创建一个自定义类。然后,您可以通过提供上下文来启动该深层链接。
请看下面的例子。
自定义类
class DynamicLinkService
Future handleDynamicLinks(BuildContext context) async
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(data, context);
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async
// handle link that has been retrieved
_handleDeepLink(dynamicLink, context);
, onError: (OnLinkErrorException e) async
print('Link Failed: $e.message');
);
void _handleDeepLink(PendingDynamicLinkData data, BuildContext context)
final Uri deepLink = data?.link;
if (deepLink != null)
print('_handleDeepLink | deeplink: $deepLink');
var isPost = deepLink.pathSegments.contains('post');
var isInvite = deepLink.pathSegments.contains('invite');
if(isInvite)
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
NavigationHomeScreen()), (Route<dynamic> route) => false);
从您的加载器小部件启动深层链接
class Loader extends StatefulWidget
@override
_LoaderState createState() => _LoaderState();
class _LoaderState extends State<Loader>
final DynamicLinkService _dynamicLinkService = DynamicLinkService();
@override
void initState()
super.initState();
_dynamicLinkService.handleDynamicLinks(context);
@override
Widget build(BuildContext context)
//Loading animation widget code
【讨论】:
以上是关于当应用程序已在运行且使用 Firebase 动态链接时导航不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何检查电子邮件地址是不是已在 iOS 上的 Firebase 中使用?
Firebase 扩展:使用 Stripe 运行订阅付款不会返回 sessionId