Flutter 在颤振中在何处处理Firebase动态链接?
我使用Firebase动态链接和命名路由。我想要的是为动态链接事件安装一个全局侦听器,如果提供了令牌,则转发到注册页面。在下面的代码中,我得到了异常Flutter 在颤振中在何处处理Firebase动态链接?,flutter,firebase-dynamic-links,Flutter,Firebase Dynamic Links,我使用Firebase动态链接和命名路由。我想要的是为动态链接事件安装一个全局侦听器,如果提供了令牌,则转发到注册页面。在下面的代码中,我得到了异常用于从导航器推送或弹出路由的上下文必须是导航器小部件的后代小部件的上下文。这意味着我必须将导航代码放在MaterialApp的主页:属性下面。但在执行此操作时,我必须为earch route实现动态链接事件处理程序 class MyApp extends StatelessWidget { String title = "Framr"; @
用于从导航器推送或弹出路由的上下文必须是导航器小部件的后代小部件的上下文。
这意味着我必须将导航代码放在MaterialApp的主页:
属性下面。但在执行此操作时,我必须为earch route实现动态链接事件处理程序
class MyApp extends StatelessWidget {
String title = "Framr";
@override
Widget build(BuildContext context) {
FirebaseDynamicLinks.instance.onLink(
onSuccess: (linkData) {
if (linkData != null) {
try {
Navigator.pushNamed(context, '/register', arguments: linkData);
// throws: The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
} catch(e) {
print(e);
}
}
return null;
}
);
return MaterialApp(
title: "...",
home: LoginPage(),
routes: {
'/createEvent': (context) => CreateEventPage(),
'/showEvent': (context) => ShowEventPage(),
'/register': (context) => RegisterPage(),
},
);
}
}
通过使用包或GlobalKey来解决调用Navigator.pushNamed(…)缺少上下文的问题,我能够按照动态链接提供的示例来完成这项工作。注意:您不必使用无上下文导航。您可以自己实现无上下文路由。这是一个例子
//添加这个
导入“package:no_context_navigation/no_context_navigation.dart”;
void main(){
runApp(材料应用程序)(
标题:“动态链接示例”,
//加上这个
NavigationWorkey:NavigationService.navigationKey,
路线:{
“/”:(BuildContext上下文)=>MyHomeWidget(),//默认主路由
“/helloworld”:(BuildContext上下文)=>MyHelloWorldWidget(),
},
));
}
类MyHomeWidgetState扩展了状态{
.
.
.
@凌驾
void initState(){
super.initState();
this.initDynamicLinks();
}
void initdynamiclings()异步{
FireBaseDynamicLink.instance.onLink(
onSuccess:(PendingDynamicLink数据dynamicLink)异步{
//加上这个。
最终导航服务navService=NavigationService();
最终Uri deepLink=dynamicLink?.link;
if(deepLink!=null){
//由于缺乏上下文,这不起作用
//pushNamed(上下文,deepLink.path);
//用这个代替
navService.pushNamed('/helloworld',args:dynamicLink);
}
},
onError:(OnLinkErrorException e)异步{
打印('onLinkError');
打印(电子信息);
}
);
final PendingDynamicLinkData=等待FirebaseDynamicLinks.instance.getInitialLink();
最终Uri deepLink=数据?.link;
if(deepLink!=null){
//由于缺乏上下文,这不起作用
//pushNamed(上下文,deepLink.path);
//用这个代替
navService.pushNamed('/helloworld',args:dynamicLink);
}
}
.
.
.
}
//公开发行
无上下文导航:^1.0.4
// Add this
import 'package:no_context_navigation/no_context_navigation.dart';
void main() {
runApp(MaterialApp(
title: 'Dynamic Links Example',
// Add this
navigatorKey: NavigationService.navigationKey,
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => MyHomeWidget(), // Default home route
'/helloworld': (BuildContext context) => MyHelloWorldWidget(),
},
));
}
class MyHomeWidgetState extends State<MyHomeWidget> {
.
.
.
@override
void initState() {
super.initState();
this.initDynamicLinks();
}
void initDynamicLinks() async {
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
// Add this.
final NavigationService navService = NavigationService();
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
// This doesn't work due to lack of context
// Navigator.pushNamed(context, deepLink.path);
// Use this instead
navService.pushNamed('/helloworld', args: dynamicLink);
}
},
onError: (OnLinkErrorException e) async {
print('onLinkError');
print(e.message);
}
);
final PendingDynamicLinkData data = await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
// This doesn't work due to lack of context
// Navigator.pushNamed(context, deepLink.path);
// Use this instead
navService.pushNamed('/helloworld', args: dynamicLink);
}
}
.
.
.
}
// pubspec.yaml
no_context_navigation: ^1.0.4