fix: deeplink service
This commit is contained in:
parent
bf5b2a8215
commit
1606622826
|
@ -2,7 +2,6 @@ import 'dart:async';
|
||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:app_links/app_links.dart';
|
|
||||||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||||
|
@ -17,12 +16,10 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||||
import 'package:hub/flutter_flow/internationalization.dart';
|
import 'package:hub/flutter_flow/internationalization.dart';
|
||||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||||
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
|
|
||||||
import 'package:hub/shared/helpers/base_storage.dart';
|
import 'package:hub/shared/helpers/base_storage.dart';
|
||||||
import 'package:hub/shared/helpers/storage_helper.dart';
|
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||||
|
|
||||||
import 'package:logging/logging.dart';
|
|
||||||
import 'package:responsive_framework/responsive_framework.dart';
|
import 'package:responsive_framework/responsive_framework.dart';
|
||||||
|
|
||||||
import 'backend/notifications/firebase_messaging_service.dart';
|
import 'backend/notifications/firebase_messaging_service.dart';
|
||||||
|
@ -118,8 +115,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||||
late AppStateNotifier _appStateNotifier;
|
late AppStateNotifier _appStateNotifier;
|
||||||
late GoRouter _router;
|
late GoRouter _router;
|
||||||
bool displaySplashImage = true;
|
bool displaySplashImage = true;
|
||||||
late AppLinks _appLinks;
|
|
||||||
StreamSubscription<Uri>? _linkSubscription;
|
|
||||||
|
|
||||||
final ThemeData _darkTheme = ThemeData(
|
final ThemeData _darkTheme = ThemeData(
|
||||||
brightness: Brightness.dark,
|
brightness: Brightness.dark,
|
||||||
|
@ -181,54 +176,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
Future<void> initDeepLinks() async {
|
|
||||||
try {
|
|
||||||
_appLinks = AppLinks();
|
|
||||||
print('initDeepLinks');
|
|
||||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
|
||||||
final bool isRecovered = StorageHelper().isRecovered;
|
|
||||||
print('isRecovered: $isRecovered');
|
|
||||||
if (isRecovered == false) await openAppLink(uri);
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
print(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> openAppLink(Uri uri) async {
|
|
||||||
print('open app link: $uri');
|
|
||||||
final bool isRecovered = StorageHelper().isRecovered;
|
|
||||||
print('isRecovered: $isRecovered');
|
|
||||||
if (isRecovered == true) return;
|
|
||||||
StorageHelper().isRecovered = true;
|
|
||||||
final String email = uri.queryParameters['email'] ?? '';
|
|
||||||
final String token = uri.queryParameters['token'] ?? '';
|
|
||||||
print('email: $email, token: $token');
|
|
||||||
final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty;
|
|
||||||
if (isNotEmpty) {
|
|
||||||
final FlutterFlowTheme theme = FlutterFlowTheme.of(context);
|
|
||||||
final Widget screen = ForgotPasswordScreen(email: email, token: token);
|
|
||||||
builder(context) => screen;
|
|
||||||
print('showModalBottomSheet');
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
|
||||||
await showModalBottomSheet(
|
|
||||||
context: StorageHelper().context!,
|
|
||||||
builder: (context) => Padding(padding: MediaQuery.viewInsetsOf(context), child: builder(context)),
|
|
||||||
isScrollControlled: true,
|
|
||||||
// barrierColor: theme.primaryBackground.withOpacity(0.2),
|
|
||||||
backgroundColor: theme.primaryBackground,
|
|
||||||
showDragHandle: true,
|
|
||||||
useSafeArea: true,
|
|
||||||
enableDrag: true,
|
|
||||||
// isDismissible: true,
|
|
||||||
).whenComplete(() {
|
|
||||||
StorageHelper().isRecovered = false;
|
|
||||||
print('showModalBottomSheet completed');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _setupFirebaseMessaging() async {
|
void _setupFirebaseMessaging() async {
|
||||||
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||||
RemoteMessage? initialMessage = await messaging.getInitialMessage();
|
RemoteMessage? initialMessage = await messaging.getInitialMessage();
|
||||||
|
@ -282,13 +229,11 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||||
);
|
);
|
||||||
|
|
||||||
_setupFirebaseMessaging();
|
_setupFirebaseMessaging();
|
||||||
initDeepLinks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
WidgetsBinding.instance.removeObserver(this);
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
_linkSubscription?.cancel();
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:hub/shared/helpers/storage_helper.dart';
|
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||||
|
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||||
|
|
||||||
import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart';
|
import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart';
|
||||||
import '/flutter_flow/flutter_flow_theme.dart';
|
import '/flutter_flow/flutter_flow_theme.dart';
|
||||||
|
@ -24,12 +25,12 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_model = createModel(context, () => SignInPageModel());
|
_model = createModel(context, () => SignInPageModel());
|
||||||
|
DeepLinkService().initDeepLinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_model.dispose();
|
_model.dispose();
|
||||||
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hub/shared/helpers/storage_helper.dart';
|
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||||
|
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||||
|
|
||||||
import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart';
|
import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart';
|
||||||
import '/flutter_flow/flutter_flow_theme.dart';
|
import '/flutter_flow/flutter_flow_theme.dart';
|
||||||
|
@ -25,6 +26,7 @@ class _SignUpPageWidgetState extends State<SignUpPageWidget> {
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_model = createModel(context, () => SignUpPageModel());
|
_model = createModel(context, () => SignUpPageModel());
|
||||||
|
DeepLinkService().initDeepLinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/scheduler.dart';
|
import 'package:flutter/scheduler.dart';
|
||||||
import 'package:hub/shared/helpers/base_storage.dart';
|
import 'package:hub/shared/helpers/base_storage.dart';
|
||||||
import 'package:hub/shared/helpers/storage_helper.dart';
|
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||||
|
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||||
|
|
||||||
import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart';
|
import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart';
|
||||||
import '/flutter_flow/flutter_flow_theme.dart';
|
import '/flutter_flow/flutter_flow_theme.dart';
|
||||||
|
@ -41,12 +43,12 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
DeepLinkService().initDeepLinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_model.dispose();
|
_model.dispose();
|
||||||
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'package:app_links/app_links.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||||
|
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
|
||||||
|
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||||
|
|
||||||
|
class DeepLinkService {
|
||||||
|
static final DeepLinkService _instance = DeepLinkService._internal();
|
||||||
|
|
||||||
|
factory DeepLinkService() => _instance;
|
||||||
|
|
||||||
|
DeepLinkService._internal();
|
||||||
|
|
||||||
|
|
||||||
|
late final AppLinks _appLinks;
|
||||||
|
StreamSubscription<Uri>? _linkSubscription;
|
||||||
|
|
||||||
|
Future<void> initDeepLinks() async {
|
||||||
|
try {
|
||||||
|
_appLinks = AppLinks();
|
||||||
|
print('initDeepLinks');
|
||||||
|
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
||||||
|
if (!StorageHelper().isRecovered) {
|
||||||
|
await _handleDeepLink(uri);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
print('Error initializing deep links: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _handleDeepLink(Uri uri) async {
|
||||||
|
print('Handling deep link: $uri');
|
||||||
|
if (StorageHelper().isRecovered) return;
|
||||||
|
|
||||||
|
StorageHelper().isRecovered = true;
|
||||||
|
final email = uri.queryParameters['email'] ?? '';
|
||||||
|
final token = uri.queryParameters['token'] ?? '';
|
||||||
|
print('email: $email, token: $token');
|
||||||
|
|
||||||
|
if (email.isNotEmpty && token.isNotEmpty) {
|
||||||
|
await _showForgotPasswordScreen(email, token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _showForgotPasswordScreen(String email, String token) async {
|
||||||
|
final theme = FlutterFlowTheme.of(StorageHelper().context!);
|
||||||
|
final screen = ForgotPasswordScreen(email: email, token: token);
|
||||||
|
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||||
|
await showModalBottomSheet(
|
||||||
|
context: StorageHelper().context!,
|
||||||
|
builder: (context) => Padding(
|
||||||
|
padding: MediaQuery.viewInsetsOf(context),
|
||||||
|
child: screen,
|
||||||
|
),
|
||||||
|
isScrollControlled: true,
|
||||||
|
backgroundColor: theme.primaryBackground,
|
||||||
|
showDragHandle: true,
|
||||||
|
useSafeArea: true,
|
||||||
|
enableDrag: true,
|
||||||
|
).whenComplete(() {
|
||||||
|
StorageHelper().isRecovered = false;
|
||||||
|
print('showModalBottomSheet completed');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void dispose() {
|
||||||
|
_linkSubscription?.cancel();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue