Merge pull request #72 from FRE-Informatica/fix/fd-986

FIX/FD-986 - Modal de Recuperação de Senha não está sendo exibido
This commit is contained in:
Ivan Antunes 2024-11-21 16:54:58 -03:00 committed by GitHub
commit c2f5a57f39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 304 additions and 228 deletions

View File

@ -16,6 +16,7 @@
<uses-permission android:name="android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE" />
<application
android:networkSecurityConfig="@xml/network_security_config"
android:label="FRE ACCESS HUB"
tools:replace="android:label"
android:icon="@mipmap/ic_launcher"

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">freaccess.com.br</domain>
</domain-config>
</network-security-config>

View File

@ -10,4 +10,9 @@
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<application
android:networkSecurityConfig="@xml/network_security_config"
android:label="FRE ACCESS HUB"
android:icon="@mipmap/ic_launcher">
</application>
</manifest>

View File

@ -217,8 +217,6 @@ PODS:
- GTMSessionFetcher/Core (3.5.0)
- image_picker_ios (0.0.1):
- Flutter
- integration_test (0.0.1):
- Flutter
- IosAwnCore (0.10.0)
- local_auth_darwin (0.0.1):
- Flutter
@ -292,7 +290,6 @@ DEPENDENCIES:
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
- google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
@ -372,8 +369,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/google_mlkit_face_detection/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
integration_test:
:path: ".symlinks/plugins/integration_test/ios"
local_auth_darwin:
:path: ".symlinks/plugins/local_auth_darwin/darwin"
path_provider_foundation:
@ -396,7 +391,7 @@ SPEC CHECKSUMS:
app_tracking_transparency: e169b653478da7bb15a6c61209015378ca73e375
awesome_notifications: dd5518ff1c80be03d4f1c40f04da9d9cc2a37af5
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
connectivity_plus: 4c41c08fc6d7c91f63bc7aec70ffe3730b04f563
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
@ -428,7 +423,6 @@ SPEC CHECKSUMS:
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
IosAwnCore: 653786a911089012092ce831f2945cd339855a89
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
@ -444,7 +438,7 @@ SPEC CHECKSUMS:
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13
sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe

View File

@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>FlutterDeepLinkingEnabled</key>
<true/>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>

View File

@ -240,8 +240,10 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
onPressed: (_model.emailAddressTextController.text == '' ||
!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text))
? null
: () async =>
AuthenticationService.forgotPassword(context, _model.emailAddressTextController.text),
: () async => await AuthenticationService.forgotPassword(
context,
_model.emailAddressTextController.text,
).then((v) => v == true ? context.pop() : null),
text: FFLocalizations.of(context).getText(
'74rnd5bu' /* Enviar */,
),

View File

@ -41,7 +41,7 @@ abstract class FlutterFlowTheme {
static void saveThemeMode(ThemeMode mode) =>
mode == ThemeMode.system ? _prefs?.remove(kThemeModeKey) : _prefs?.setBool(kThemeModeKey, mode == ThemeMode.dark);
static FlutterFlowTheme of(BuildContext context) {
deviceSize = getDeviceSize(context);
// deviceSize = getDeviceSize(context);
return Theme.of(context).brightness == Brightness.dark ? DarkModeTheme() : LightModeTheme();
}

View File

@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
@ -28,6 +29,8 @@ export 'serialization_util.dart';
const kTransitionInfoKey = '__transition_info__';
final GlobalKey<NavigatorState> key = GlobalKey<NavigatorState>();
class AppStateNotifier extends ChangeNotifier {
AppStateNotifier._();
@ -44,8 +47,17 @@ class AppStateNotifier extends ChangeNotifier {
GoRouter createRouter(AppStateNotifier appStateNotifier) {
return GoRouter(
navigatorKey: key,
initialLocation: '/',
debugLogDiagnostics: true,
redirect: (context, state) {
if (Platform.isIOS) {
if (state.uri.toString().contains("freaccess://changepass/")) {
throw Exception('Redirecting to forgotPassword');
}
}
return null;
},
refreshListenable: appStateNotifier,
// errorBuilder: (context, state) => appStateNotifier.showSplashImage
// ? Builder(
@ -80,19 +92,28 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
builder: (context, _) {
return FutureBuilder<Widget>(
future: () async {
final bool isLogged =
await StorageHelper().get(SecureStorageKey.isLogged.value, Storage.SecureStorage) == 'true';
final bool haveLocal =
await StorageHelper().get(SecureStorageKey.haveLocal.value, Storage.SecureStorage) == 'true';
final bool haveUserUUID =
(await StorageHelper().get(SQLiteStorageKey.userUUID.value, Storage.SQLiteStorage))?.isNotEmpty ??
final bool isLogged = await StorageHelper().get(
SecureStorageKey.isLogged.value, Storage.SecureStorage) ==
'true';
final bool haveLocal = await StorageHelper().get(
SecureStorageKey.haveLocal.value,
Storage.SecureStorage) ==
'true';
final bool haveUserUUID = (await StorageHelper().get(
SQLiteStorageKey.userUUID.value,
Storage.SQLiteStorage))
?.isNotEmpty ??
false;
final bool haveDevUUID =
(await StorageHelper().get(SQLiteStorageKey.devUUID.value, Storage.SQLiteStorage))?.isNotEmpty ??
final bool haveDevUUID = (await StorageHelper().get(
SQLiteStorageKey.devUUID.value,
Storage.SQLiteStorage))
?.isNotEmpty ??
false;
if (isLogged && haveDevUUID && haveUserUUID) {
return haveLocal ? const HomePageWidget() : const ReceptionPageWidget();
return haveLocal
? const HomePageWidget()
: const ReceptionPageWidget();
} else {
return const WelcomePageWidget();
}
@ -114,8 +135,10 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
name: 'forgotPassword',
path: '/forgotPassword',
builder: (context, params) {
late final String email = params.getParam('email', ParamType.String);
late final String token = params.getParam('token', ParamType.String);
late final String email =
params.getParam('email', ParamType.String);
late final String token =
params.getParam('token', ParamType.String);
return ForgotPasswordScreen(
key: UniqueKey(),
@ -128,7 +151,10 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
path: '/homePage',
builder: (context, params) => HomePageWidget(key: UniqueKey()),
),
FFRoute(name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()),
FFRoute(
name: 'receptionPage',
path: '/receptionPage',
builder: (context, params) => const ReceptionPageWidget()),
FFRoute(
name: 'messageHistoryPage',
path: '/messageHistoryPage',
@ -243,7 +269,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
extension NavParamExtensions on Map<String, String?> {
Map<String, String> get withoutNulls => Map.fromEntries(
entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)),
entries
.where((e) => e.value != null)
.map((e) => MapEntry(e.key, e.value!)),
);
}
@ -260,7 +288,8 @@ extension NavigationExtensions on BuildContext {
}
extension _GoRouterStateExtensions on GoRouterState {
Map<String, dynamic> get extraMap => extra != null ? extra as Map<String, dynamic> : {};
Map<String, dynamic> get extraMap =>
extra != null ? extra as Map<String, dynamic> : {};
Map<String, dynamic> get allParams => <String, dynamic>{}
..addAll(pathParameters)
..addAll(uri.queryParameters)
@ -273,8 +302,9 @@ extension _GoRouterStateExtensions on GoRouterState {
extension GoRouterLocationExtension on GoRouter {
String getCurrentLocation() {
final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
final RouteMatchList matchList =
lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration;
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
? lastMatch.matches
: routerDelegate.currentConfiguration;
return matchList.uri.toString();
}
}
@ -290,13 +320,17 @@ class FFParameters {
// Parameters are empty if the params map is empty or if the only parameter
// present is the special extra parameter reserved for the transition info.
bool get isEmpty =>
state.allParams.isEmpty || (state.allParams.length == 1 && state.extraMap.containsKey(kTransitionInfoKey));
bool isAsyncParam(MapEntry<String, dynamic> param) => asyncParams.containsKey(param.key) && param.value is String;
state.allParams.isEmpty ||
(state.allParams.length == 1 &&
state.extraMap.containsKey(kTransitionInfoKey));
bool isAsyncParam(MapEntry<String, dynamic> param) =>
asyncParams.containsKey(param.key) && param.value is String;
bool get hasFutures => state.allParams.entries.any(isAsyncParam);
Future<bool> completeFutures() => Future.wait(
state.allParams.entries.where(isAsyncParam).map(
(param) async {
final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null);
final doc = await asyncParams[param.key]!(param.value)
.onError((_, __) => null);
if (doc != null) {
futureParamValues[param.key] = doc;
return true;
@ -370,7 +404,9 @@ class FFRoute {
key: state.pageKey,
child: child,
transitionDuration: transitionInfo.duration,
transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition(
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
PageTransition(
type: transitionInfo.transitionType,
duration: transitionInfo.duration,
reverseDuration: transitionInfo.duration,
@ -402,7 +438,8 @@ class TransitionInfo {
final Duration duration;
final Alignment? alignment;
static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false);
static TransitionInfo appDefault() =>
const TransitionInfo(hasTransition: false);
}
class RootPageContext {
@ -414,7 +451,9 @@ class RootPageContext {
final rootPageContext = context.read<RootPageContext?>();
final isRootPage = rootPageContext?.isRootPage ?? false;
final location = GoRouterState.of(context).uri.toString();
return isRootPage && location != '/' && location != rootPageContext?.errorRoute;
return isRootPage &&
location != '/' &&
location != rootPageContext?.errorRoute;
}
static Widget wrap(Widget child, {String? errorRoute}) => Provider.value(

View File

@ -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,11 +16,11 @@ 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/deeplink/deep_link_service.dart';
import 'package:hub/shared/services/localization/localization_service.dart';
import 'package:hub/shared/utils/device_util.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'backend/notifications/firebase_messaging_service.dart';
@ -83,7 +82,8 @@ Future<void> _initializeFlutterFlow() async {
Future<void> _foregroundHandlerMessage(RemoteMessage message) async {
if (message.data['click_action'] == 'enroll_cond') {
await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
await StorageHelper()
.set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
StorageHelper().context?.go('/homePage');
}
@ -97,7 +97,8 @@ Future<void> _foregroundHandlerMessage(RemoteMessage message) async {
Future<void> _backgroundHandlerMessage(RemoteMessage message) async {
if (message.data['click_action'] == 'enroll_cond') {
await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
await StorageHelper()
.set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
StorageHelper().context?.go('/homePage');
}
}
@ -108,7 +109,8 @@ class App extends StatefulWidget {
@override
State<App> createState() => _AppState();
static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
static _AppState of(BuildContext context) =>
context.findAncestorStateOfType<_AppState>()!;
}
class _AppState extends State<App> with WidgetsBindingObserver {
@ -117,8 +119,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,
@ -152,7 +152,8 @@ class _AppState extends State<App> with WidgetsBindingObserver {
}),
),
);
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates =
const [
FFLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
@ -180,41 +181,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
);
};
Future<void> initDeepLinks() async {
_appLinks = AppLinks();
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
final bool isRecovered = StorageHelper().isRecovered;
if (!isRecovered) openAppLink(uri);
});
}
void openAppLink(Uri uri) {
final bool isRecovered = StorageHelper().isRecovered;
log('isRecovered: $isRecovered');
if (isRecovered) return;
StorageHelper().isRecovered = true;
final String email = uri.queryParameters['email'] ?? '';
final String token = uri.queryParameters['token'] ?? '';
final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty;
if (isNotEmpty) {
final BuildContext context = StorageHelper().context!;
final FlutterFlowTheme theme = FlutterFlowTheme.of(context);
final Widget screen = ForgotPasswordScreen(email: email, token: token);
builder(context) => screen;
showModalBottomSheet(
context: 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);
}
}
void _setupFirebaseMessaging() async {
FirebaseMessaging messaging = FirebaseMessaging.instance;
RemoteMessage? initialMessage = await messaging.getInitialMessage();
@ -226,16 +192,19 @@ class _AppState extends State<App> with WidgetsBindingObserver {
FirebaseMessaging.onMessage.listen(_foregroundHandlerMessage);
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) async {
if (message.data['click_action'] == 'enroll_cond') {
await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
await StorageHelper().set(
SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
log('onMessageOpenedApp');
} else {
onMessageReceived(message.data, message.notification!.body, message.data['click_action']);
onMessageReceived(message.data, message.notification!.body,
message.data['click_action']);
}
});
FirebaseMessaging.instance.getInitialMessage().then((message) async {
if (message != null) {
if (message.data['click_action'] == 'enroll_cond') {
await StorageHelper().set(SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
await StorageHelper().set(
SecureStorageKey.haveLocal.value, 'true', Storage.SecureStorage);
log('getInitialMessage');
}
}
@ -263,16 +232,17 @@ class _AppState extends State<App> with WidgetsBindingObserver {
_appStateNotifier = AppStateNotifier.instance;
_router = createRouter(_appStateNotifier);
Future.delayed(
const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage()));
const Duration(milliseconds: 1000),
() => setState(() => _appStateNotifier.stopShowingSplashImage()),
);
_setupFirebaseMessaging();
WidgetsBinding.instance.addPersistentFrameCallback((_) => initDeepLinks());
DeepLinkService().ensureInitialization();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
_linkSubscription?.cancel();
super.dispose();
}

View File

@ -232,7 +232,11 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
? null
: () async {
await AuthenticationService.changePassword(
context, widget.email, _model.passwordConfirmFormTextController!.text, widget.token);
context,
widget.email,
_model.passwordConfirmFormTextController!.text,
widget.token,
).then((v) => v == true ? context.pop() : null);
setState(() {});
},
text: FFLocalizations.of(context).getVariableText(

View File

@ -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';
@ -29,7 +30,6 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
@override
void dispose() {
_model.dispose();
super.dispose();
}

View File

@ -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';

View File

@ -3,6 +3,7 @@ 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';
@ -31,13 +32,16 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
// On page load action.
SchedulerBinding.instance.addPostFrameCallback((_) async {
if (isAndroid == true) {
await StorageHelper().set(SecureStorageKey.deviceType.value, 'Android', Storage.SecureStorage);
await StorageHelper().set(SecureStorageKey.deviceType.value, 'Android',
Storage.SecureStorage);
setState(() {});
} else if (isiOS == true) {
await StorageHelper().set(SecureStorageKey.deviceType.value, 'iOS', Storage.SecureStorage);
await StorageHelper().set(
SecureStorageKey.deviceType.value, 'iOS', Storage.SecureStorage);
setState(() {});
} else {
await StorageHelper().set(SecureStorageKey.deviceType.value, 'Web', Storage.SecureStorage);
await StorageHelper().set(
SecureStorageKey.deviceType.value, 'Web', Storage.SecureStorage);
setState(() {});
}
});
@ -46,7 +50,6 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
@override
void dispose() {
_model.dispose();
super.dispose();
}

View File

@ -10,10 +10,11 @@ class StorageHelper {
StorageHelper._internal();
late BuildContext? _context;
late bool _isRecovered = false;
BuildContext? get context => _context;
set context(BuildContext? context) => _context = context;
late bool _isRecovered = false;
bool get isRecovered => _isRecovered;
set isRecovered(bool isRecovered) => _isRecovered = isRecovered;
@ -24,7 +25,7 @@ class StorageHelper {
String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value);
if (isFirstRun == 'true') {
if (isFirstRun != 'false') {
await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, 'false');
await SecureStorage.instance.set(SecureStorageKey.isLogged.value, 'false');
}

View File

@ -142,7 +142,7 @@ class AuthenticationService {
context.go('/welcomePage', extra: extra);
}
static Future<void> forgotPassword(BuildContext context, String email) async {
static Future<bool> forgotPassword(BuildContext context, String email) async {
try {
final ApiCallResponse? response;
final ForgotPasswordCall callback = PhpGroup.forgotPasswordCall;
@ -153,16 +153,19 @@ class AuthenticationService {
if (response.jsonBody['error'] == false) {
await DialogUtil.success(context, message);
return true;
} else {
await DialogUtil.error(context, response.jsonBody['error_msg']);
return false;
}
} catch (e, s) {
await DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed('forgotPassword.php', email, "Forgot Password", e, s);
return false;
}
}
static Future<void> changePassword(BuildContext context, String email, String password, String token) async {
static Future<bool> changePassword(BuildContext context, String email, String password, String token) async {
try {
final ApiCallResponse response =
await PhpGroup.changePasswordCall.call(email: email, psswd: password, token: token);
@ -173,13 +176,16 @@ class AuthenticationService {
ptText: "Senha alterada com sucesso!",
);
await DialogUtil.success(context, message).then((_) => context.pop);
return true;
} else {
final String message = response.jsonBody['error_msg'];
await DialogUtil.error(context, message);
return false;
}
} catch (e, s) {
await DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed('changePassword.php', email, "Change Password", e, s);
return false;
}
}

View File

@ -0,0 +1,85 @@
import 'dart:async';
import 'dart:developer';
import 'package:app_links/app_links.dart';
import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.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/storage_helper.dart';
class DeepLinkService {
static final DeepLinkService _instance = DeepLinkService._internal();
factory DeepLinkService() => _instance;
DeepLinkService._internal();
late final AppLinks _appLinks;
StreamSubscription<Uri>? _linkSubscription;
bool _isInitialized = false;
void ensureInitialization() async {
if (_isInitialized) return;
try {
_appLinks = AppLinks();
print('initDeepLinks');
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
if (!StorageHelper().isRecovered) {
await _handleDeepLink(uri);
}
});
_isInitialized = true;
} catch (e) {
print('Error initializing deep links: $e');
}
}
Future<void> _handleDeepLink(Uri uri) async {
try {
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);
}
} catch (e, s) {
print('Error handling deep link: $e, $s');
log('Error handling', error: e, stackTrace: s);
}
}
Future<void> _showForgotPasswordScreen(String email, String token) async {
try {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await showModalBottomSheet(
context: key.currentContext!,
builder: (context) => Padding(
padding: MediaQuery.viewInsetsOf(context),
child: ForgotPasswordScreen(email: email, token: token),
),
isScrollControlled: true,
backgroundColor:
FlutterFlowTheme.of(key.currentContext!).primaryBackground,
showDragHandle: true,
useSafeArea: true,
enableDrag: true,
).whenComplete(() {
StorageHelper().isRecovered = false;
print('showModalBottomSheet completed');
});
});
} catch (e, s) {
print('Error showing forgot password screen: $e, $s');
log('Error handling', error: e, stackTrace: s);
}
}
void dispose() {
_linkSubscription?.cancel();
}
}

View File

@ -1,3 +1,4 @@
import 'dart:developer';
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
@ -13,7 +14,7 @@ class DeviceUtil {
return androidId;
} on PlatformException catch (e) {
print("Failed to get Android ID: '${e.message}'.");
log("Failed to get Android ID: '${e.message}'.");
return null;
}

View File

@ -5,13 +5,14 @@ import 'package:hub/backend/api_requests/api_calls.dart';
class LogUtil {
static void requestAPIFailed(String url, String body, String reason, dynamic error, StackTrace stack) async {
log("URL: ${PhpGroup.getBaseUrl()}/$url");
final fullUrl = "${PhpGroup.getBaseUrl()}/$url";
log("URL: $fullUrl");
log("Body: $body");
log("Motivo: $reason");
log("Reason: $reason");
log("Error: ${error.toString()}");
log("Stack: ${stack.toString()}");
FirebaseCrashlytics.instance.setCustomKey('URL', "${PhpGroup.getBaseUrl()}/$url");
FirebaseCrashlytics.instance.setCustomKey('URL', fullUrl);
FirebaseCrashlytics.instance.setCustomKey('Body', body);
await FirebaseCrashlytics.instance.recordError(error, stack, reason: reason);

View File

@ -165,10 +165,10 @@ packages:
dependency: transitive
description:
name: camera_avfoundation
sha256: "0d04cec8715b59fb6dc60eefb47e69024f51233c570e475b886dc9290568bca7"
sha256: "2e4c568f70e406ccb87376bc06b53d2f5bebaab71e2fbcc1a950e31449381bcf"
url: "https://pub.dev"
source: hosted
version: "0.9.17+4"
version: "0.9.17+5"
camera_platform_interface:
dependency: transitive
description:
@ -205,10 +205,10 @@ packages:
dependency: transitive
description:
name: cli_util
sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
url: "https://pub.dev"
source: hosted
version: "0.4.1"
version: "0.4.2"
clock:
dependency: transitive
description:
@ -229,10 +229,10 @@ packages:
dependency: "direct main"
description:
name: connectivity_plus
sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0"
sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3"
url: "https://pub.dev"
source: hosted
version: "6.0.5"
version: "6.1.0"
connectivity_plus_platform_interface:
dependency: transitive
description:
@ -261,10 +261,10 @@ packages:
dependency: "direct main"
description:
name: crypto
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.6"
csv:
dependency: "direct main"
description:
@ -341,10 +341,10 @@ packages:
dependency: "direct main"
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
sha256: b35578f687b79243d39008c44d638474d93e9091e578c970efef41ce0c3fa000
url: "https://pub.dev"
source: hosted
version: "2.0.5"
version: "2.0.6"
fake_async:
dependency: transitive
description:
@ -365,10 +365,10 @@ packages:
dependency: transitive
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.0"
version: "7.0.1"
file_picker:
dependency: "direct main"
description:
@ -381,10 +381,10 @@ packages:
dependency: transitive
description:
name: file_selector_linux
sha256: "712ce7fab537ba532c8febdb1a8f167b32441e74acd68c3ccb2e36dcb52c4ab2"
sha256: b2b91daf8a68ecfa4a01b778a6f52edef9b14ecd506e771488ea0f2e0784198b
url: "https://pub.dev"
source: hosted
version: "0.9.3"
version: "0.9.3+1"
file_selector_macos:
dependency: transitive
description:
@ -501,10 +501,10 @@ packages:
dependency: transitive
description:
name: fixnum
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.1.1"
flutter:
dependency: "direct main"
description: flutter
@ -534,11 +534,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.4.1"
flutter_driver:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_expandable_fab:
dependency: "direct main"
description:
@ -636,10 +631,10 @@ packages:
dependency: "direct main"
description:
name: flutter_riverpod
sha256: "711d916456563f715bde1e139d7cfdca009f8264befab3ac9f8ded8b6ec26405"
sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1"
url: "https://pub.dev"
source: hosted
version: "2.5.3"
version: "2.6.1"
flutter_secure_storage:
dependency: "direct main"
description:
@ -716,10 +711,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
sha256: "936d9c1c010d3e234d1672574636f3352b4941ca3decaddd3cafaeb9ad49c471"
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
version: "2.0.15"
flutter_test:
dependency: "direct dev"
description: flutter
@ -742,10 +737,10 @@ packages:
dependency: "direct main"
description:
name: font_awesome_flutter
sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f"
sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a
url: "https://pub.dev"
source: hosted
version: "10.7.0"
version: "10.8.0"
from_css_color:
dependency: "direct main"
description:
@ -754,19 +749,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
fuchsia_remote_debug_protocol:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
go_router:
dependency: "direct main"
description:
name: go_router
sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc"
sha256: "8ae664a70174163b9f65ea68dd8673e29db8f9095de7b5cd00e167c621f4fef5"
url: "https://pub.dev"
source: hosted
version: "14.3.0"
version: "14.6.0"
google_fonts:
dependency: "direct main"
description:
@ -819,10 +809,10 @@ packages:
dependency: "direct dev"
description:
name: image
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d
url: "https://pub.dev"
source: hosted
version: "4.2.0"
version: "4.3.0"
image_picker:
dependency: "direct main"
description:
@ -835,18 +825,18 @@ packages:
dependency: "direct main"
description:
name: image_picker_android
sha256: d34e0d9e024e81321b2aeed7b202ec6181cc282e6a1c0c0b4e6ad07ef1065d82
sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32"
url: "https://pub.dev"
source: hosted
version: "0.8.12+16"
version: "0.8.12+17"
image_picker_for_web:
dependency: "direct main"
description:
name: image_picker_for_web
sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50"
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.6"
image_picker_ios:
dependency: "direct main"
description:
@ -887,11 +877,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
integration_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
intl:
dependency: "direct main"
description:
@ -1008,10 +993,10 @@ packages:
dependency: transitive
description:
name: logging
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.3.0"
matcher:
dependency: transitive
description:
@ -1032,10 +1017,10 @@ packages:
dependency: "direct main"
description:
name: material_symbols_icons
sha256: fa19f3a99f280c81fe23d7f7ef1c4000511fa40ee52df43e0a3a4c91184ddb15
sha256: "1dea2aef1c83434f832f14341a5ffa1254e76b68e4d90333f95f8a2643bf1024"
url: "https://pub.dev"
source: hosted
version: "4.2788.0"
version: "4.2799.0"
maybe_just_nothing:
dependency: transitive
description:
@ -1112,18 +1097,18 @@ packages:
dependency: transitive
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
version: "1.1.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.5"
path_provider_android:
dependency: "direct main"
description:
@ -1184,10 +1169,10 @@ packages:
dependency: transitive
description:
name: permission_handler_android
sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa"
sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1"
url: "https://pub.dev"
source: hosted
version: "12.0.12"
version: "12.0.13"
permission_handler_apple:
dependency: transitive
description:
@ -1200,10 +1185,10 @@ packages:
dependency: transitive
description:
name: permission_handler_html
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
url: "https://pub.dev"
source: hosted
version: "0.1.3+2"
version: "0.1.3+5"
permission_handler_platform_interface:
dependency: transitive
description:
@ -1240,10 +1225,10 @@ packages:
dependency: transitive
description:
name: platform
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.5"
version: "3.1.6"
plugin_platform_interface:
dependency: "direct main"
description:
@ -1252,14 +1237,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
process:
dependency: transitive
description:
name: process
sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
url: "https://pub.dev"
source: hosted
version: "5.0.2"
provider:
dependency: "direct main"
description:
@ -1304,10 +1281,10 @@ packages:
dependency: transitive
description:
name: riverpod
sha256: c86fedfb45dd1da98ee6493dd9374325cdf494e7d523ebfb0c387eecc5f7b5c9
sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959"
url: "https://pub.dev"
source: hosted
version: "2.5.3"
version: "2.6.1"
rxdart:
dependency: "direct main"
description:
@ -1336,10 +1313,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.3.3"
shared_preferences_android:
dependency: "direct main"
description:
@ -1413,10 +1390,10 @@ packages:
dependency: "direct main"
description:
name: sqflite
sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62"
sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.4.1"
sqflite_android:
dependency: transitive
description:
@ -1429,18 +1406,18 @@ packages:
dependency: transitive
description:
name: sqflite_common
sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490"
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
url: "https://pub.dev"
source: hosted
version: "2.5.4+5"
version: "2.5.4+6"
sqflite_darwin:
dependency: transitive
description:
name: sqflite_darwin
sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027"
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
url: "https://pub.dev"
source: hosted
version: "2.4.1-1"
version: "2.4.1"
sqflite_platform_interface:
dependency: transitive
description:
@ -1489,14 +1466,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.0"
sync_http:
dependency: transitive
description:
name: sync_http
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
url: "https://pub.dev"
source: hosted
version: "0.3.1"
synchronized:
dependency: "direct main"
description:
@ -1533,10 +1502,10 @@ packages:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.4.0"
url_launcher:
dependency: "direct main"
description:
@ -1549,10 +1518,10 @@ packages:
dependency: "direct main"
description:
name: url_launcher_android
sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2"
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.12"
version: "6.3.14"
url_launcher_ios:
dependency: "direct main"
description:
@ -1565,10 +1534,10 @@ packages:
dependency: transitive
description:
name: url_launcher_linux
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
@ -1597,10 +1566,10 @@ packages:
dependency: transitive
description:
name: url_launcher_windows
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
version: "3.1.3"
uuid:
dependency: "direct overridden"
description:
@ -1613,26 +1582,26 @@ packages:
dependency: transitive
description:
name: vector_graphics
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.15"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.12"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
sha256: ab9ff38fc771e9ee1139320adbe3d18a60327370c218c60752068ebee4b49ab1
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.15"
vector_math:
dependency: transitive
description:
@ -1657,14 +1626,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.5.1"
webdriver:
dependency: transitive
description:
name: webdriver
sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
webview_flutter:
dependency: "direct main"
description:
@ -1677,10 +1638,10 @@ packages:
dependency: transitive
description:
name: webview_flutter_android
sha256: "74693a212d990b32e0b7055d27db973a18abf31c53942063948cdfaaef9787ba"
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "4.1.0"
webview_flutter_platform_interface:
dependency: transitive
description:
@ -1693,10 +1654,10 @@ packages:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30"
url: "https://pub.dev"
source: hosted
version: "3.16.0"
version: "3.16.2"
win32:
dependency: "direct overridden"
description:

View File

@ -3,7 +3,7 @@ description: A new Flutter project.
publish_to: "none"
version: 1.2.0+14
version: 1.2.1+17
environment:
sdk: ">=3.0.0 <4.0.0"
@ -28,7 +28,7 @@ dependencies:
firebase_messaging: ^15.1.0
dropdown_button2: 2.3.9
easy_debounce: 2.0.3
equatable: 2.0.5
equatable: ^2.0.6
file_picker: ^8.0.7
flutter_expandable_fab: ^2.1.0
firebase_analytics: ^11.3.0
@ -45,8 +45,8 @@ dependencies:
flutter_secure_storage_windows: 3.1.2
flutter_spinkit: 5.2.1
flutter_staggered_grid_view: 0.7.0
flutter_svg: 2.0.10+1
font_awesome_flutter: 10.7.0
flutter_svg: ^2.0.15
font_awesome_flutter: ^10.8.0
from_css_color: 2.0.0
go_router: ^14.3.0
google_fonts: 6.2.1
@ -110,18 +110,16 @@ dependency_overrides:
dev_dependencies:
flutter_launcher_icons: ^0.14.1
flutter_lints: ^5.0.0
image: 4.2.0
image: ^4.3.0
lints: ^5.0.0
# build_runner: ^2.4.13
# mockito: ^5.4.4
integration_test:
sdk: flutter
# build_runner: ^2.4.13
# mockito: ^5.4.4
# integration_test:
# sdk: flutter
flutter_test:
sdk: flutter
flutter_launcher_icons:
android: "launcher_icon"
ios: true
@ -131,8 +129,6 @@ flutter_launcher_icons:
adaptive_icon_background: "assets/images/adaptive_background_icon.svg"
adaptive_icon_foreground: "assets/images/adaptive_foreground_icon.svg"
flutter:
uses-material-design: true