Flutter Firebase Dynamic Link Navigator.push 不导航
Flutter Firebase Dynamic Link Navigator.push not navigating
我正在尝试快速实现 Firebase Dynamic links。但是当我点击 link 时它会调用函数但不会将我带到指定的页面。
代码实现
main.dart
申请的主要条目最终结果
void main() {
Crashlytics.instance.enableInDevMode = true;
FlutterError.onError = Crashlytics.instance.recordFlutterError;
runZoned(() {
runApp(MyApp());
}, onError: Crashlytics.instance.recordError);
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
DynamicLinks dynamicLinks = new DynamicLinks();
dynamicLinks.initDynamicLinks(context);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return LayoutBuilder(builder: (context, constraints) {
return OrientationBuilder(builder: (context, orientation) {
SizeConfig().init(constraints, orientation);
return MaterialApp(
title: 'APP NAME',
theme: ThemeData(
primarySwatch: Colors.orange,
brightness: Brightness.light,
),
debugShowCheckedModeBanner: false,
home:SplashScreenMain(),
);
});
});
}
}
dynamicLinkManager.dart
另一个 class 来处理动态链接。
class DynamicLinks {
void initDynamicLinks(BuildContext context) async{
var data = await FirebaseDynamicLinks.instance.getInitialLink();
FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink) async {
print("Main = ${dynamicLink}");
var deepLink = dynamicLink?.link;
final queryParams = deepLink.queryParameters;
debugPrint('DynamicLinks onLink $deepLink');
print("queryParams $queryParams");
if(DynamicLinksConst.inviteUser == deepLink.path){
print("Step 1.......Code Works");
/* THIS PART CODE IS NOT WORKING */
Login.setActiveContext(context);
Navigator.push(context,
EaseInOutSinePageRoute(
widget: SignupPage()), //MaterialPageRoute
);
}else{
Navigator.push(context,
EaseInOutSinePageRoute(
widget: LoginPage()), //MaterialPageRoute
);
}
}, onError: (e) async {
debugPrint('DynamicLinks onError $e');
});
}
}
控制台输出
这是输出,您可以看到它的返回数据由动态 link 捕获。
我不认为这是 firebase dynamic link 的问题,感觉更像是 Navigator 的问题,但我无法在此处确定问题,因为此 Navigator 在整个过程中都正常工作项目期待这里
EaseInOutSinePageRoute 只是为导航添加动画。
I/flutter ( 395): Main = Instance of 'PendingDynamicLinkData'
I/flutter ( 395): DynamicLinks onLink https://example.com/abc?para1=dataOne
I/flutter ( 395): queryParams {para1: dataOne}
I/flutter ( 395): Step 1.......Code Works
正如我在评论中提到的,这里的问题是 Navigator.push()
中没有使用预期的 BuildContext。
没有最少的复现,很难提供具体的解决方案。由于您已经提到您正在使用推送新 page/screen 的 Authenticator
class,因此在单个 class 中管理应用程序的屏幕可能更安全.这样,管理 Navigator.push()
中使用的 BuildContext 就更容易了。您可以查看此 sample in this blog post 并查看它是否适合您的用例。
我正在尝试快速实现 Firebase Dynamic links。但是当我点击 link 时它会调用函数但不会将我带到指定的页面。
代码实现
main.dart
申请的主要条目最终结果
void main() {
Crashlytics.instance.enableInDevMode = true;
FlutterError.onError = Crashlytics.instance.recordFlutterError;
runZoned(() {
runApp(MyApp());
}, onError: Crashlytics.instance.recordError);
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
DynamicLinks dynamicLinks = new DynamicLinks();
dynamicLinks.initDynamicLinks(context);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return LayoutBuilder(builder: (context, constraints) {
return OrientationBuilder(builder: (context, orientation) {
SizeConfig().init(constraints, orientation);
return MaterialApp(
title: 'APP NAME',
theme: ThemeData(
primarySwatch: Colors.orange,
brightness: Brightness.light,
),
debugShowCheckedModeBanner: false,
home:SplashScreenMain(),
);
});
});
}
}
dynamicLinkManager.dart
另一个 class 来处理动态链接。
class DynamicLinks {
void initDynamicLinks(BuildContext context) async{
var data = await FirebaseDynamicLinks.instance.getInitialLink();
FirebaseDynamicLinks.instance.onLink(onSuccess: (dynamicLink) async {
print("Main = ${dynamicLink}");
var deepLink = dynamicLink?.link;
final queryParams = deepLink.queryParameters;
debugPrint('DynamicLinks onLink $deepLink');
print("queryParams $queryParams");
if(DynamicLinksConst.inviteUser == deepLink.path){
print("Step 1.......Code Works");
/* THIS PART CODE IS NOT WORKING */
Login.setActiveContext(context);
Navigator.push(context,
EaseInOutSinePageRoute(
widget: SignupPage()), //MaterialPageRoute
);
}else{
Navigator.push(context,
EaseInOutSinePageRoute(
widget: LoginPage()), //MaterialPageRoute
);
}
}, onError: (e) async {
debugPrint('DynamicLinks onError $e');
});
}
}
控制台输出 这是输出,您可以看到它的返回数据由动态 link 捕获。 我不认为这是 firebase dynamic link 的问题,感觉更像是 Navigator 的问题,但我无法在此处确定问题,因为此 Navigator 在整个过程中都正常工作项目期待这里
EaseInOutSinePageRoute 只是为导航添加动画。
I/flutter ( 395): Main = Instance of 'PendingDynamicLinkData'
I/flutter ( 395): DynamicLinks onLink https://example.com/abc?para1=dataOne
I/flutter ( 395): queryParams {para1: dataOne}
I/flutter ( 395): Step 1.......Code Works
正如我在评论中提到的,这里的问题是 Navigator.push()
中没有使用预期的 BuildContext。
没有最少的复现,很难提供具体的解决方案。由于您已经提到您正在使用推送新 page/screen 的 Authenticator
class,因此在单个 class 中管理应用程序的屏幕可能更安全.这样,管理 Navigator.push()
中使用的 BuildContext 就更容易了。您可以查看此 sample in this blog post 并查看它是否适合您的用例。