应用程序已运行且使用Firebase动态链接时导航不起作用
我有一个加载程序小部件,它可以检查动态链接,并在应用程序使用动态链接打开时导航到应用程序已运行且使用Firebase动态链接时导航不起作用,firebase,flutter,dart,firebase-dynamic-links,Firebase,Flutter,Dart,Firebase Dynamic Links,我有一个加载程序小部件,它可以检查动态链接,并在应用程序使用动态链接打开时导航到/game路径(gamePage()小部件)。如果应用程序是手动打开的,它将导航到/home路线 我的代码可以在应用程序关闭后通过动态链接打开时正常工作。 但是当应用程序已经打开并且在主页上时,代码就不能工作了,因为上下文是空的 装载机省道 class Loader extends StatefulWidget { @override _LoaderState createState() => _Loa
/game
路径(gamePage()
小部件)。如果应用程序是手动打开的,它将导航到/home
路线
我的代码可以在应用程序关闭后通过动态链接打开时正常工作。
但是当应用程序已经打开并且在主页上时,代码就不能工作了,因为上下文是空的
装载机省道
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
}
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
Future initdynamiclings()异步{
final PendingDynamicLinkData=等待FirebaseDynamicLinks.instance.getInitialLink();
最终Uri deepLink=数据?.link;
印刷(深度链接);
if(deepLink!=null){
Navigator.pushReplacementNamed(context,“/game”);//由于应用程序刚刚启动,所以此操作有效
}
否则{
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
最终Uri deepLink=dynamicLink?.link;
if(deepLink!=null){
打印(上下文);//打印空
Navigator.pushReplacementNamed(context,/game');//这不起作用,因为应用程序已在运行,并且其on/home和context为null
}
},
onError:(OnLinkErrorException e)异步{
打印(“打开链接时出错”);
打印(电子信息);
}
);
Navigator.pushreplacementname(上下文,“/home”);//如果没有深层链接,则加载home小部件
}
}
@凌驾
void initState(){
super.initState();
initdynamiclings();
}
@凌驾
小部件构建(构建上下文){
//加载动画小部件代码
}
}
主飞镖
void main() {
runApp(MaterialApp(
initialRoute: "/load",
routes:<String, WidgetBuilder> {
'/load': (context) => Loader(),
'/home': (context) => Home(),
'/game': (context) => gamePage(),
},
),
);
}
void main(){
runApp(材料应用程序)(
initialRoute:“/load”,
路线:{
“/load”:(上下文)=>Loader(),
“/home”:(上下文)=>home(),
“/game”:(上下文)=>gamePage(),
},
),
);
}
我是个新手,非常感谢你的帮助。谢谢。是的,你说得对。没有上下文,它就不起作用。所以每次深层链接调用时,您都需要提供一个上下文 要实现这一点,请为managedeep链接创建一个自定义类。然后,您可以通过提供上下文来启动深度链接 请参见下面的示例 定制类
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);
}
}
}
}
类动态链接服务{
未来HandleDynamicLink(BuildContext上下文)异步{
最终PendingDynamicLink数据=
等待FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(数据、上下文);
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
//已检索的句柄链接
_handleDeepLink(动态链接,上下文);
},onError:(OnLinkErrorException e)异步{
打印('链接失败:${e.message}');
});
}
void _handleDeepLink(PendingDynamicLinkData数据,BuildContext上下文){
最终Uri deepLink=数据?.link;
if(deepLink!=null){
打印(“U handleDeepLink | deeplink:$deeplink”);
var isPost=deepLink.pathSegments.contains('post');
var isInvite=deepLink.pathSegments.contains('invite');
如果(isInvite){
Navigator.of(context).pushandremoveintil(materialpage路线)(生成器:(context)=>
NavigationHomeScreen(),(路由)=>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
}
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
最终DynamicClinkService _dynamicClinkService=dynamicClinkService();
@凌驾
void initState(){
super.initState();
_DynamicClinkService.handleDynamicLinks(上下文);
}
@凌驾
小部件构建(构建上下文){
//加载动画小部件代码
}
}
是的,你说得对。没有上下文,它就不起作用。所以每次深层链接调用时,您都需要提供一个上下文
要实现这一点,请为managedeep链接创建一个自定义类。然后,您可以通过提供上下文来启动深度链接
请参见下面的示例
定制类
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);
}
}
}
}
类动态链接服务{
未来HandleDynamicLink(BuildContext上下文)异步{
最终PendingDynamicLink数据=
等待FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(数据、上下文);
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
//已检索的句柄链接
_handleDeepLink(动态链接,上下文);
},onError:(OnLinkErrorException e)异步{
打印('链接失败:${e.message}');
});
}
void _handleDeepLink(PendingDynamicLinkData数据,BuildContext上下文){
最终Uri deepLink=数据?.link;
if(deepLink!=null){
打印(“U handleDeepLink | deeplink:$deeplink”);
var isPost=deepLink.pathSegments.contains('post');
var isInvite=deepLink.pathSegments.contains('invite');
如果(isInvite){
Navigator.of(context).pushandremoveintil(materialpage路线)(生成器:(context)=>
NavigationHomeScreen(),(路由)=>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
}
}
类加载器扩展StatefulWidget{
@凌驾
_LoaderState createState();
}
类_LoaderState扩展状态{
最终DynamicClinkService _dynamicClinkService=dynamicClinkService();
@凌驾
void initState(){
super.initState();
_动力