fix: deeplink service
This commit is contained in:
parent
bf5b2a8215
commit
1606622826
|
@ -2,7 +2,6 @@ import 'dart:async';
|
|||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||||
import 'package:firebase_core/firebase_core.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/internationalization.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/storage_helper.dart';
|
||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:responsive_framework/responsive_framework.dart';
|
||||
|
||||
import 'backend/notifications/firebase_messaging_service.dart';
|
||||
|
@ -118,8 +115,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
late AppStateNotifier _appStateNotifier;
|
||||
late GoRouter _router;
|
||||
bool displaySplashImage = true;
|
||||
late AppLinks _appLinks;
|
||||
StreamSubscription<Uri>? _linkSubscription;
|
||||
|
||||
final ThemeData _darkTheme = ThemeData(
|
||||
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 {
|
||||
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||
RemoteMessage? initialMessage = await messaging.getInitialMessage();
|
||||
|
@ -282,13 +229,11 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
);
|
||||
|
||||
_setupFirebaseMessaging();
|
||||
initDeepLinks();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
_linkSubscription?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:hub/shared/helpers/storage_helper.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 '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
@ -24,12 +25,12 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
|
|||
void initState() {
|
||||
super.initState();
|
||||
_model = createModel(context, () => SignInPageModel());
|
||||
DeepLinkService().initDeepLinks();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_model.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/helpers/storage_helper.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 '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
@ -25,6 +26,7 @@ class _SignUpPageWidgetState extends State<SignUpPageWidget> {
|
|||
void initState() {
|
||||
super.initState();
|
||||
_model = createModel(context, () => SignUpPageModel());
|
||||
DeepLinkService().initDeepLinks();
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:hub/shared/helpers/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage_helper.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 '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
@ -41,12 +43,12 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
|
|||
setState(() {});
|
||||
}
|
||||
});
|
||||
DeepLinkService().initDeepLinks();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_model.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