v1.26.10 login exception handling with bloc 8.0

This commit is contained in:
Tibor Bossanyi (Freelancer) 2022-10-19 21:55:17 +02:00
commit 208ada4251
18 changed files with 390 additions and 339 deletions

View File

@ -52,6 +52,11 @@ android {
multiDexEnabled true multiDexEnabled true
} }
android {
compileSdkVersion 33
}
signingConfigs { signingConfigs {
release { release {
keyAlias keystoreProperties['keyAlias'] keyAlias keystoreProperties['keyAlias']

View File

@ -5,18 +5,10 @@
additional functionality it is fine to subclass or reimplement additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. --> FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application android:name="${applicationName}" android:label="WorkoutTest" android:icon="@mipmap/launcher_icon">
android:name="${applicationName}" <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
android:label="WorkoutTest" <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
android:icon="@mipmap/launcher_icon"> <activity android:name="io.flutter.embedding.android.FlutterActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" android:allowBackup="false" android:fullBackupContent="false">
<activity android:name="io.flutter.embedding.android.FlutterActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:allowBackup="false"
android:fullBackupContent="false">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues while the Flutter UI initializes. After that, this theme continues
@ -65,4 +57,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>
<queries>
<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
</queries>
</manifest> </manifest>

View File

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">WorkoutTest</string> <string name="app_name">WorkoutTest</string>
<!-- Replace "000000000000" with your Facebook App ID here. --> <!-- Replace "000000000000" with your Facebook App ID here. -->
<string name="facebook_app_id">584181112271127</string> <string name="facebook_app_id">584181112271127</string>
<string name="facebook_client_token">60d565f451ce32de3d7eeb26274bbddd</string>
<!-- <!--
Replace "000000000000" with your Facebook App ID here. Replace "000000000000" with your Facebook App ID here.
**NOTE**: The scheme needs to start with `fb` and then your ID. **NOTE**: The scheme needs to start with `fb` and then your ID.
--> -->
<string name="fb_login_protocol_scheme">fb584181112271127</string> <string name="fb_login_protocol_scheme">fb584181112271127</string>
</resources> </resources>

View File

@ -88,40 +88,59 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> with Trans {
void _onSubmit(LoginSubmit event, Emitter<LoginState> emit) async { void _onSubmit(LoginSubmit event, Emitter<LoginState> emit) async {
emit(LoginLoading()); emit(LoginLoading());
await userRepository.getUser(); try {
accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); await userRepository.getUser();
Track().track(TrackingEvent.login, eventValue: "email"); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!));
Cache().setLoginType(LoginType.email); Track().track(TrackingEvent.login, eventValue: "email");
Cache().setLoginType(LoginType.email);
emit(LoginSuccess()); } on Exception catch(e) {
emit(LoginError(message: e.toString()));
} finally {
emit(LoginSuccess());
}
} }
void _onLoginFB(LoginFB event, Emitter<LoginState> emit) async { void _onLoginFB(LoginFB event, Emitter<LoginState> emit) async {
emit(LoginLoading()); emit(LoginLoading());
Cache().setLoginType(LoginType.fb); try {
await userRepository.getUserByFB(); Cache().setLoginType(LoginType.fb);
accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); await userRepository.getUserByFB();
Track().track(TrackingEvent.login, eventValue: "FB"); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!));
emit(LoginSuccess()); Track().track(TrackingEvent.login, eventValue: "FB");
} on Exception catch(e) {
emit(LoginError(message: e.toString()));
} finally {
emit(LoginSuccess());
}
} }
void _onLoginGoogle(LoginGoogle event, Emitter<LoginState> emit) async { void _onLoginGoogle(LoginGoogle event, Emitter<LoginState> emit) async {
emit(LoginLoading()); emit(LoginLoading());
Cache().setLoginType(LoginType.google); try {
await userRepository.getUserByGoogle(); Cache().setLoginType(LoginType.google);
accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); await userRepository.getUserByGoogle();
Track().track(TrackingEvent.login, eventValue: "Google"); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!));
Track().track(TrackingEvent.login, eventValue: "Google");
emit(LoginSuccess()); } on Exception catch(e) {
emit(LoginError(message: e.toString()));
} finally {
emit(LoginSuccess());
}
} }
void _onLoginApple(LoginApple event, Emitter<LoginState> emit) async { void _onLoginApple(LoginApple event, Emitter<LoginState> emit) async {
emit(LoginLoading()); emit(LoginLoading());
Cache().setLoginType(LoginType.apple); try {
await userRepository.getUserByApple(); Cache().setLoginType(LoginType.apple);
accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!)); await userRepository.getUserByApple();
Track().track(TrackingEvent.login, eventValue: "Apple"); accountBloc.add(AccountLogInFinished(customer: Cache().userLoggedIn!));
emit(LoginSuccess()); Track().track(TrackingEvent.login, eventValue: "Apple");
} on Exception catch(e) {
emit(LoginError(message: e.toString()));
} finally {
emit(LoginSuccess());
}
} }
void _onRegistrationSubmit(RegistrationSubmit event, Emitter<LoginState> emit) async { void _onRegistrationSubmit(RegistrationSubmit event, Emitter<LoginState> emit) async {

View File

@ -161,7 +161,7 @@ class SalesBloc extends Bloc<SalesEvent, SalesState> with Logging {
return; return;
} }
String productSetString = splitTestRepository.getSplitTestValue("product_set_2"); String productSetString = splitTestRepository.getSplitTestValue("product_set_5");
log("ProductSetString: $productSetString"); log("ProductSetString: $productSetString");
try { try {
productSet = int.parse(productSetString); productSet = int.parse(productSetString);

View File

@ -296,7 +296,7 @@ class DropdownSearchState<T> extends State<DropdownSearch<T?>> {
initialValue: widget.selectedItem, initialValue: widget.selectedItem,
builder: (FormFieldState<T> state) { builder: (FormFieldState<T> state) {
if (state.value != value) { if (state.value != value) {
WidgetsBinding.instance!.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
state.didChange(value); state.didChange(value);
}); });
} }

View File

@ -182,7 +182,7 @@ class _SelectDialogState<T> extends State<SelectDialog<T?>> {
content: _errorWidget(error), content: _errorWidget(error),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: new Text("OK"), child: const Text("OK"),
onPressed: () { onPressed: () {
Navigator.of(context).pop(false); Navigator.of(context).pop(false);
}, },

View File

@ -1127,7 +1127,7 @@ class _AnimationWrapperState extends State<_AnimationWrapper> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) { if (mounted) {
setState(() { setState(() {
opacity = 1.0; opacity = 1.0;

View File

@ -54,10 +54,11 @@ import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:aitrainer_app/util/app_localization.dart'; import 'package:aitrainer_app/util/app_localization.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart'; //import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:flutter_smartlook/flutter_smartlook.dart'; //import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'package:upgrader/upgrader.dart'; import 'package:upgrader/upgrader.dart';
import 'bloc/account/account_bloc.dart'; import 'bloc/account/account_bloc.dart';
import 'bloc/body_development/body_development_bloc.dart'; import 'bloc/body_development/body_development_bloc.dart';
@ -104,7 +105,8 @@ Future<Null> _reportError(dynamic error, dynamic stackTrace) async {
); );
final String platform = Platform.isAndroid ? "Android" : "iOS"; final String platform = Platform.isAndroid ? "Android" : "iOS";
final String version = Cache().packageInfo != null ? Cache().packageInfo!.version + "+" + Cache().packageInfo!.buildNumber : ""; final String version = Cache().packageInfo != null ? Cache().packageInfo!.version + "+" + Cache().packageInfo!.buildNumber : "";
final sentryId = await Sentry.captureException(error, stackTrace: stackTrace, hint: "Platform: $platform, Version: $version, User: $customerId"); final sentryId =
await Sentry.captureException(error, stackTrace: stackTrace, hint: "Platform: $platform, Version: $version, User: $customerId");
print('Capture exception result : SentryId : $sentryId'); print('Capture exception result : SentryId : $sentryId');
} }
@ -146,7 +148,12 @@ Future<Null> main() async {
Future<void> initThirdParty() async { Future<void> initThirdParty() async {
if (!isInDebugMode) { if (!isInDebugMode) {
//await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true); //await FlurryData.initialize(androidKey: "JNYCTCWBT34FM3J8TV36", iosKey: "3QBG7BSMGPDH24S8TRQP", enableLog: true);
FlutterUxcam.optIntoSchematicRecordings(); await MatomoTracker.instance.initialize(
siteId: 3,
url: 'https://matomo.workouttest.com/matomo.php',
//visitorId: 'customer_1',
);
//FlutterUxcam.optIntoSchematicRecordings();
} }
await FirebaseApi().initializeFlutterFire(); await FirebaseApi().initializeFlutterFire();
} }
@ -154,11 +161,11 @@ Future<Null> main() async {
final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository(); final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository();
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
if (!isInDebugMode) { if (!isInDebugMode) {
FlutterUxcam.startWithKey("wvdstyoml4tiwfd"); //FlutterUxcam.startWithKey("wvdstyoml4tiwfd");
SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build(); //SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build();
Smartlook.setupAndStartRecording(options); //Smartlook.setupAndStartRecording(options);
Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING); //Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING);
} }
await initThirdParty(); await initThirdParty();
final FirebaseAnalytics analytics = FirebaseAnalytics.instance; final FirebaseAnalytics analytics = FirebaseAnalytics.instance;
@ -194,7 +201,8 @@ Future<Null> main() async {
BlocProvider<TestSetExecuteBloc>( BlocProvider<TestSetExecuteBloc>(
create: (BuildContext context) => TestSetExecuteBloc(), create: (BuildContext context) => TestSetExecuteBloc(),
), ),
BlocProvider<TutorialBloc>(create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())), BlocProvider<TutorialBloc>(
create: (BuildContext context) => TutorialBloc(tutorialName: ActivityDone.tutorialExecuteFirstTest.toStr())),
BlocProvider<TrainingPlanBloc>(create: (context) { BlocProvider<TrainingPlanBloc>(create: (context) {
final MenuBloc menuBloc = BlocProvider.of<MenuBloc>(context); final MenuBloc menuBloc = BlocProvider.of<MenuBloc>(context);
return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository()); return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository());
@ -216,9 +224,6 @@ class WorkoutTestApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// Only call clearSavedSettings() during testing to reset internal values.
Upgrader().clearSavedSettings(); // REMOVE this for release builds
Upgrader().installAppStoreListingURL(Platform.isAndroid Upgrader().installAppStoreListingURL(Platform.isAndroid
? "https://play.google.com/store/apps/details?id=com.aitrainer.aitrainer_app" ? "https://play.google.com/store/apps/details?id=com.aitrainer.aitrainer_app"
: "https://apps.apple.com/hu/app/workouttest/id1515271425"); : "https://apps.apple.com/hu/app/workouttest/id1515271425");

View File

@ -34,12 +34,13 @@ import 'package:aitrainer_app/util/track.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart';
//import 'package:flurry_data/flurry_data.dart'; //import 'package:flurry_data/flurry_data.dart';
import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; import 'package:flutter_facebook_auth/flutter_facebook_auth.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart'; //import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:aitrainer_app/model/exercise_type.dart'; import 'package:aitrainer_app/model/exercise_type.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:flutter_smartlook/flutter_smartlook.dart'; //import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'customer_exercise_device.dart'; import 'customer_exercise_device.dart';
import 'exercise_device.dart'; import 'exercise_device.dart';
@ -175,7 +176,7 @@ class Cache with Logging {
List<Exercise>? _exercisesTrainee; List<Exercise>? _exercisesTrainee;
ExercisePlan? _traineeExercisePlan; ExercisePlan? _traineeExercisePlan;
RemoteConfig? remoteConfig; FirebaseRemoteConfig? remoteConfig;
LinkedHashMap<String, int> _badges = LinkedHashMap(); LinkedHashMap<String, int> _badges = LinkedHashMap();
@ -544,7 +545,8 @@ class Cache with Logging {
ExercisePlan? getMyExercisePlan() => _myExercisePlan; ExercisePlan? getMyExercisePlan() => _myExercisePlan;
void setMyExercisePlanDetails(LinkedHashMap<int, ExercisePlanDetail> listExercisePlanDetail) => _myExercisesPlanDetails = listExercisePlanDetail; void setMyExercisePlanDetails(LinkedHashMap<int, ExercisePlanDetail> listExercisePlanDetail) =>
_myExercisesPlanDetails = listExercisePlanDetail;
void addToMyExercisePlanDetails(ExercisePlanDetail detail) => _myExercisesPlanDetails[detail.exerciseTypeId] = detail; void addToMyExercisePlanDetails(ExercisePlanDetail detail) => _myExercisesPlanDetails[detail.exerciseTypeId] = detail;
@ -558,7 +560,8 @@ class Cache with Logging {
void deleteMyExercisePlanDetail(ExercisePlanDetail detail) => this.deleteMyExercisePlanDetailByExerciseTypeId(detail.exerciseTypeId); void deleteMyExercisePlanDetail(ExercisePlanDetail detail) => this.deleteMyExercisePlanDetailByExerciseTypeId(detail.exerciseTypeId);
void deletedMyExercisePlanDetail(ExercisePlanDetail detail) => this._myExercisesPlanDetails[detail.exerciseTypeId]!.change = ModelChange.deleted; void deletedMyExercisePlanDetail(ExercisePlanDetail detail) =>
this._myExercisesPlanDetails[detail.exerciseTypeId]!.change = ModelChange.deleted;
void deleteMyExercisePlanDetailByExerciseTypeId(int exerciseTypeId) { void deleteMyExercisePlanDetailByExerciseTypeId(int exerciseTypeId) {
this._myExercisesPlanDetails[exerciseTypeId]!.change = ModelChange.delete; this._myExercisesPlanDetails[exerciseTypeId]!.change = ModelChange.delete;
@ -686,14 +689,21 @@ class Cache with Logging {
Future<void> initCustomer(int customerId) async { Future<void> initCustomer(int customerId) async {
log(" *** initCustomer"); log(" *** initCustomer");
await PackageApi().getCustomerPackage(customerId); try {
await PackageApi().getCustomerPackage(customerId);
} on Exception catch (_) {
return;
}
if (!isInDebugMode) { if (!isInDebugMode) {
//FlurryData.setUserId(customerId.toString()); //FlurryData.setUserId(customerId.toString());
FlutterUxcam.setUserProperty("username", customerId.toString()); //FlutterUxcam.setUserProperty("username", customerId.toString());
FlutterUxcam.setUserIdentity(customerId.toString()); //FlutterUxcam.setUserIdentity(customerId.toString());
Smartlook.setUserIdentifier(customerId.toString()); //Smartlook.setUserIdentifier(customerId.toString());
//Smartlook.instance.
Track().track(TrackingEvent.enter); Track().track(TrackingEvent.enter);
MatomoTracker.instance
.trackEvent(eventName: TrackingEvent.enter.enumToString(), eventCategory: "", action: TrackingEvent.enter.enumToString(), eventValue: customerId);
} }
await Future.forEach(ActivityDone.values, (element) async { await Future.forEach(ActivityDone.values, (element) async {
@ -751,8 +761,8 @@ class Cache with Logging {
List<Tutorial>? get tutorials => this._tutorials; List<Tutorial>? get tutorials => this._tutorials;
setTutorials(List<Tutorial>? value) => this._tutorials = value; setTutorials(List<Tutorial>? value) => this._tutorials = value;
RemoteConfig? getRemoteConfig() => this.remoteConfig; FirebaseRemoteConfig? getRemoteConfig() => this.remoteConfig;
setRemoteConfig(RemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig; setRemoteConfig(FirebaseRemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig;
List<Description>? getDescriptions() => this._descriptions; List<Description>? getDescriptions() => this._descriptions;
setDescriptions(List<Description>? value) => this._descriptions = value; setDescriptions(List<Description>? value) => this._descriptions = value;

View File

@ -2,8 +2,9 @@ import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart';
class RemoteConfigRepository with Logging { class RemoteConfigRepository with Logging {
RemoteConfig? remoteConfig; FirebaseRemoteConfig? remoteConfig;
String getConfigValue(String configKey, String baseValue) { String getConfigValue(String configKey, String baseValue) {
String value = ""; String value = "";

View File

@ -3,8 +3,9 @@ import 'package:aitrainer_app/repository/description_repository.dart';
import 'package:aitrainer_app/service/logging.dart'; import 'package:aitrainer_app/service/logging.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:firebase_remote_config/firebase_remote_config.dart';
class SplitTestRepository with Logging { class SplitTestRepository with Logging {
final RemoteConfig? _remoteConfig = Cache().remoteConfig; final FirebaseRemoteConfig? _remoteConfig = Cache().remoteConfig;
final DescriptionRepository descriptionRepository = DescriptionRepository(); final DescriptionRepository descriptionRepository = DescriptionRepository();
String getSplitTestValue(String remoteConfigKey) { String getSplitTestValue(String remoteConfigKey) {

View File

@ -384,13 +384,14 @@ class FirebaseApi with logging.Logging {
RemoteConfig? remoteConfig; RemoteConfig? remoteConfig;
try { try {
remoteConfig = RemoteConfig.instance; remoteConfig = RemoteConfig.instance;
await remoteConfig.setConfigSettings(RemoteConfigSettings( await remoteConfig.setConfigSettings(
RemoteConfigSettings(
fetchTimeout: const Duration(seconds: 10), fetchTimeout: const Duration(seconds: 10),
minimumFetchInterval: const Duration(seconds: 1), minimumFetchInterval: const Duration(seconds: 1),
)); ));
RemoteConfigValue(null, ValueSource.valueStatic); //RemoteConfigValue(null, ValueSource.valueStatic);
Cache().setRemoteConfig(remoteConfig); //Cache().setRemoteConfig(remoteConfig);
} on Exception catch (e) { } on Exception catch (e) {
print('Unable to fetch remote config. Cached or default values will be used: $e'); print('Unable to fetch remote config. Cached or default values will be used: $e');
if (remoteConfig != null) { if (remoteConfig != null) {

View File

@ -44,62 +44,44 @@ class PackageApi {
final List<String> headRecord = element.split("***"); final List<String> headRecord = element.split("***");
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
if (headRecord[0] == "ExerciseDevice") { if (headRecord[0] == "ExerciseDevice") {
final List<ExerciseDevice> devices = final List<ExerciseDevice> devices = json.map((device) => ExerciseDevice.fromJson(device)).toList();
json.map((device) => ExerciseDevice.fromJson(device)).toList();
Cache().setDevices(devices); Cache().setDevices(devices);
} else if (headRecord[0] == "Product") { } else if (headRecord[0] == "Product") {
final List<Product> products = final List<Product> products = json.map((product) => Product.fromJson(product)).toList();
json.map((product) => Product.fromJson(product)).toList();
Cache().setProducts(products); Cache().setProducts(products);
} else if (headRecord[0] == "Property") { } else if (headRecord[0] == "Property") {
final List<Property> properties = final List<Property> properties = json.map((property) => Property.fromJson(property)).toList();
json.map((property) => Property.fromJson(property)).toList();
Cache().setProperties(properties); Cache().setProperties(properties);
} else if (headRecord[0] == "ExerciseTree") { } else if (headRecord[0] == "ExerciseTree") {
exerciseTree = json exerciseTree = json.map((exerciseTree) => ExerciseTree.fromJson(exerciseTree)).toList();
.map((exerciseTree) => ExerciseTree.fromJson(exerciseTree))
.toList();
} else if (headRecord[0] == "ExerciseType") { } else if (headRecord[0] == "ExerciseType") {
final List<ExerciseType> exerciseTypes = json final List<ExerciseType> exerciseTypes = json.map((exerciseType) => ExerciseType.fromJson(exerciseType)).toList();
.map((exerciseType) => ExerciseType.fromJson(exerciseType))
.toList();
await Future.forEach(exerciseTypes, (elem) async { await Future.forEach(exerciseTypes, (elem) async {
final ExerciseType exerciseType = elem as ExerciseType; final ExerciseType exerciseType = elem as ExerciseType;
exerciseType.imageUrl = await ExerciseTypeApi() exerciseType.imageUrl = await ExerciseTypeApi().buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId);
.buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId);
}); });
Cache().setExerciseTypes(exerciseTypes); Cache().setExerciseTypes(exerciseTypes);
} else if (headRecord[0] == "ExerciseAbility") { } else if (headRecord[0] == "ExerciseAbility") {
} else if (headRecord[0] == "ExercisePlanTemplate") { } else if (headRecord[0] == "ExercisePlanTemplate") {
final List<ExercisePlanTemplate> exercisePlanTemplates = json final List<ExercisePlanTemplate> exercisePlanTemplates =
.map((exercisePlanTemplate) => json.map((exercisePlanTemplate) => ExercisePlanTemplate.fromJson(exercisePlanTemplate)).toList();
ExercisePlanTemplate.fromJson(exercisePlanTemplate))
.toList();
Cache().setExercisePlanTemplates(exercisePlanTemplates); Cache().setExercisePlanTemplates(exercisePlanTemplates);
} else if (headRecord[0] == "ExerciseTreeParents") { } else if (headRecord[0] == "ExerciseTreeParents") {
exerciseTreeParents = json exerciseTreeParents = json.map((exerciseTreeParent) => ExerciseTreeParents.fromJson(exerciseTreeParent)).toList();
.map((exerciseTreeParent) =>
ExerciseTreeParents.fromJson(exerciseTreeParent))
.toList();
} else if (headRecord[0] == "Evaluation") { } else if (headRecord[0] == "Evaluation") {
final List<Evaluation> evaluations = final List<Evaluation> evaluations = json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
Cache().evaluations = evaluations; Cache().evaluations = evaluations;
} else if (headRecord[0] == "Sport") { } else if (headRecord[0] == "Sport") {
final List<Sport> sports = final List<Sport> sports = json.map((sport) => Sport.fromJson(sport)).toList();
json.map((sport) => Sport.fromJson(sport)).toList();
Cache().setSports(sports); Cache().setSports(sports);
} else if (headRecord[0] == "Tutorial") { } else if (headRecord[0] == "Tutorial") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<Tutorial> tutorials = final List<Tutorial> tutorials = json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
Cache().setTutorials(tutorials); Cache().setTutorials(tutorials);
} else if (headRecord[0] == "Description") { } else if (headRecord[0] == "Description") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<Description>? descriptions = json final List<Description>? descriptions = json.map((description) => Description.fromJson(description)).toList();
.map((description) => Description.fromJson(description))
.toList();
//print("Description: $descriptions"); //print("Description: $descriptions");
Cache().setDescriptions(descriptions); Cache().setDescriptions(descriptions);
} else if (headRecord[0] == "Faq") { } else if (headRecord[0] == "Faq") {
@ -109,8 +91,7 @@ class PackageApi {
Cache().setFaqs(faqs); Cache().setFaqs(faqs);
} else if (headRecord[0] == "TrainingPlan") { } else if (headRecord[0] == "TrainingPlan") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<TrainingPlan>? plans = final List<TrainingPlan>? plans = json.map((plan) => TrainingPlan.fromJson(plan)).toList();
json.map((plan) => TrainingPlan.fromJson(plan)).toList();
List<TrainingPlan> activePlans = []; List<TrainingPlan> activePlans = [];
if (plans != null) { if (plans != null) {
@ -123,38 +104,31 @@ class PackageApi {
Cache().setTrainingPlans(activePlans); Cache().setTrainingPlans(activePlans);
} else if (headRecord[0] == "SplitTests") { } else if (headRecord[0] == "SplitTests") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<SplitTest>? tests = final List<SplitTest>? tests = json.map((test) => SplitTest.fromJson(test)).toList();
json.map((test) => SplitTest.fromJson(test)).toList();
//print("A/B tests: $tests"); //print("A/B tests: $tests");
Cache().setSplitTests(tests); Cache().setSplitTests(tests);
} else if (headRecord[0] == "TrainingPlanDay") { } else if (headRecord[0] == "TrainingPlanDay") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<TrainingPlanDay>? days = final List<TrainingPlanDay>? days = json.map((day) => TrainingPlanDay.fromJson(day)).toList();
json.map((day) => TrainingPlanDay.fromJson(day)).toList();
Cache().setTrainingPlanDays(days); Cache().setTrainingPlanDays(days);
} }
}); });
exerciseTree = exerciseTree = this.getExerciseTreeParents(exerciseTree, exerciseTreeParents);
this.getExerciseTreeParents(exerciseTree, exerciseTreeParents);
await Future.forEach(exerciseTree, (element) async { await Future.forEach(exerciseTree, (element) async {
ExerciseTree tree = element as ExerciseTree; ExerciseTree tree = element as ExerciseTree;
tree.imageUrl = tree.imageUrl = await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId);
await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId);
}); });
Cache().setExerciseTree(exerciseTree); Cache().setExerciseTree(exerciseTree);
TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository();
TrainingPlanDayRepository();
trainingPlanDayRepository.assignTrainingPlanDays(); trainingPlanDayRepository.assignTrainingPlanDays();
return; return;
} }
List<ExerciseTree> getExerciseTreeParents( List<ExerciseTree> getExerciseTreeParents(final List<ExerciseTree> exerciseTree, final List<ExerciseTreeParents> exerciseTreeParents) {
final List<ExerciseTree> exerciseTree,
final List<ExerciseTreeParents> exerciseTreeParents) {
List<ExerciseTree> copyList = ExerciseTreeApi().copyList(exerciseTree); List<ExerciseTree> copyList = ExerciseTreeApi().copyList(exerciseTree);
int treeIndex = 0; int treeIndex = 0;
@ -184,8 +158,7 @@ class PackageApi {
Future<void> getCustomerPackage(int customerId) async { Future<void> getCustomerPackage(int customerId) async {
try { try {
final body = await _client.get( final body = await _client.get("app_customer_package/" + customerId.toString(), "");
"app_customer_package/" + customerId.toString(), "");
final List<String> models = body.split("|||"); final List<String> models = body.split("|||");
await Future.forEach(models, (elem) async { await Future.forEach(models, (elem) async {
@ -197,33 +170,24 @@ class PackageApi {
Cache().userLoggedIn = customer; Cache().userLoggedIn = customer;
} else if (headRecord[0] == "CustomerExerciseDevice") { } else if (headRecord[0] == "CustomerExerciseDevice") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerExerciseDevice> devices = json final List<CustomerExerciseDevice> devices = json.map((device) => CustomerExerciseDevice.fromJson(device)).toList();
.map((device) => CustomerExerciseDevice.fromJson(device))
.toList();
Cache().setCustomerDevices(devices); Cache().setCustomerDevices(devices);
// ToDo // ToDo
} else if (headRecord[0] == "Exercises") { } else if (headRecord[0] == "Exercises") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<Exercise> exercises = json final List<Exercise> exercises = json.map((exerciseType) => Exercise.fromJson(exerciseType)).toList();
.map((exerciseType) => Exercise.fromJson(exerciseType))
.toList();
Cache().setExercises(exercises); Cache().setExercises(exercises);
} else if (headRecord[0] == "Purchase") { } else if (headRecord[0] == "Purchase") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<Purchase> purchases = final List<Purchase> purchases = json.map((purchase) => Purchase.fromJson(purchase)).toList();
json.map((purchase) => Purchase.fromJson(purchase)).toList();
Cache().setPurchases(purchases); Cache().setPurchases(purchases);
} else if (headRecord[0] == "CustomerProperty") { } else if (headRecord[0] == "CustomerProperty") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> customerProperties = json final List<CustomerProperty> customerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList();
.map((property) => CustomerProperty.fromJson(property))
.toList();
CustomerApi().initProperties(customerProperties); CustomerApi().initProperties(customerProperties);
} else if (headRecord[0] == "CustomerPropertyAll") { } else if (headRecord[0] == "CustomerPropertyAll") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> allCustomerProperties = json final List<CustomerProperty> allCustomerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList();
.map((property) => CustomerProperty.fromJson(property))
.toList();
print(" All Properties ---- $allCustomerProperties"); print(" All Properties ---- $allCustomerProperties");
Cache().setCustomerPropertyAll(allCustomerProperties); Cache().setCustomerPropertyAll(allCustomerProperties);
} else if (headRecord[0] == "ExerciseResult") { } else if (headRecord[0] == "ExerciseResult") {
@ -235,14 +199,12 @@ class PackageApi {
// ToDo */ // ToDo */
} else if (headRecord[0] == "CustomerActivity") { } else if (headRecord[0] == "CustomerActivity") {
final Iterable json = jsonDecode(headRecord[1]); final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerActivity> customerActivities = json final List<CustomerActivity> customerActivities = json.map((activity) => CustomerActivity.fromJson(activity)).toList();
.map((activity) => CustomerActivity.fromJson(activity))
.toList();
Cache().setCustomerActivities(customerActivities); Cache().setCustomerActivities(customerActivities);
} }
}); });
} on NotFoundException catch (_) { } on NotFoundException catch (e) {
throw Exception("Please log in"); throw Exception("Please log in $e");
} }
} }
} }

View File

@ -7,8 +7,9 @@ import 'package:aitrainer_app/model/tracking.dart' as model;
import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
//import 'package:flurry_data/flurry_data.dart'; //import 'package:flurry_data/flurry_data.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart'; //import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:flutter_smartlook/flutter_smartlook.dart'; //import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
class Track with Logging { class Track with Logging {
static final Track _singleton = Track._internal(); static final Track _singleton = Track._internal();
@ -23,8 +24,8 @@ class Track with Logging {
void track(TrackingEvent event, {String eventValue = ""}) { void track(TrackingEvent event, {String eventValue = ""}) {
if (!isInDebugMode) { if (!isInDebugMode) {
//FlurryData.logEvent(event.enumToString()); //FlurryData.logEvent(event.enumToString());
Smartlook.setGlobalEventProperty(event.toString(), eventValue, false); //Smartlook.setGlobalEventProperty(event.toString(), eventValue, false);
FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue}); //FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue});
model.Tracking tracking = model.Tracking(); model.Tracking tracking = model.Tracking();
tracking.customerId = Cache().userLoggedIn == null ? 0 : Cache().userLoggedIn!.customerId!; tracking.customerId = Cache().userLoggedIn == null ? 0 : Cache().userLoggedIn!.customerId!;
tracking.event = event.enumToString(); tracking.event = event.enumToString();
@ -37,6 +38,7 @@ class Track with Logging {
FirebaseMessaging.instance.subscribeToTopic(event.enumToString()); FirebaseMessaging.instance.subscribeToTopic(event.enumToString());
analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue}); analytics.logEvent(name: event.enumToString(), parameters: {"value": eventValue});
MatomoTracker.instance.trackEvent(eventName: event.enumToString(), eventCategory: "", action: eventValue, eventValue: tracking.customerId);
} }
} }
} }

View File

@ -70,17 +70,7 @@ class _HomePageState extends State<AitrainerHome> with Logging, Trans {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: UpgradeAlert( body: UpgradeAlert(
appcastConfig: cfg, upgrader: Upgrader(appcastConfig: cfg, messages: MyLocalizedUpgraderMessages(context: context)),
dialogStyle: UpgradeDialogStyle.cupertino,
countryCode: AppLanguage().appLocal.languageCode,
showIgnore: false,
showLater: false,
showReleaseNotes: false,
debugLogging: true,
//debugAlwaysUpgrade: true,
//debugDisplayOnce: true,
//minAppVersion: Cache().packageInfo != null ? Cache().packageInfo!.version : "99.99.99",
messages: MyLocalizedUpgraderMessages(context: context),
child: BlocConsumer<SessionBloc, SessionState>(listener: (context, state) { child: BlocConsumer<SessionBloc, SessionState>(listener: (context, state) {
if (state is SessionFailure) { if (state is SessionFailure) {
showDialog( showDialog(
@ -148,6 +138,8 @@ class MyLocalizedUpgraderMessages extends UpgraderMessages with Trans {
return t('Want to update?'); return t('Want to update?');
case UpgraderMessage.title: case UpgraderMessage.title:
return t('Update App?'); return t('Update App?');
case UpgraderMessage.releaseNotes:
return "";
} }
// Messages that are not provided above can still use the default values. // Messages that are not provided above can still use the default values.

View File

@ -7,14 +7,21 @@ packages:
name: _fe_analyzer_shared name: _fe_analyzer_shared
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "31.0.0" version: "47.0.0"
_flutterfire_internals:
dependency: transitive
description:
name: _flutterfire_internals
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.0" version: "4.7.0"
animated_widgets: animated_widgets:
dependency: "direct main" dependency: "direct main"
description: description:
@ -42,7 +49,7 @@ packages:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.2" version: "2.9.0"
badges: badges:
dependency: "direct main" dependency: "direct main"
description: description:
@ -56,14 +63,14 @@ packages:
name: bloc name: bloc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.0.3" version: "8.1.0"
bloc_test: bloc_test:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: bloc_test name: bloc_test
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "9.0.3" version: "9.1.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -77,7 +84,7 @@ packages:
name: build name: build
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "2.3.1"
build_config: build_config:
dependency: transitive dependency: transitive
description: description:
@ -91,21 +98,21 @@ packages:
name: build_daemon name: build_daemon
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.1.0"
build_resolvers: build_resolvers:
dependency: transitive dependency: transitive
description: description:
name: build_resolvers name: build_resolvers
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.6" version: "2.0.10"
build_runner: build_runner:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.8" version: "2.1.11"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
@ -140,7 +147,7 @@ packages:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@ -169,34 +176,41 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
cli_util:
dependency: transitive
description:
name: cli_util
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
cloud_firestore_platform_interface:
dependency: transitive
description:
name: cloud_firestore_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "5.8.1"
cloud_firestore_web:
dependency: transitive
description:
name: cloud_firestore_web
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
code_builder: code_builder:
dependency: transitive dependency: transitive
description: description:
name: code_builder name: code_builder
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.0" version: "4.3.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.16.0"
confetti: confetti:
dependency: "direct main" dependency: "direct main"
description: description:
@ -259,56 +273,56 @@ packages:
name: dart_style name: dart_style
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "2.2.4"
device_info_plus: device_info_plus:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus name: device_info_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.2" version: "4.1.3"
device_info_plus_linux: device_info_plus_linux:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_linux name: device_info_plus_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "3.0.0"
device_info_plus_macos: device_info_plus_macos:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_macos name: device_info_plus_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.2" version: "3.0.0"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_platform_interface name: device_info_plus_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0+1" version: "3.0.0"
device_info_plus_web: device_info_plus_web:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_web name: device_info_plus_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "3.0.0"
device_info_plus_windows: device_info_plus_windows:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_windows name: device_info_plus_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "4.1.0"
devicelocale: devicelocale:
dependency: "direct main" dependency: "direct main"
description: description:
name: devicelocale name: devicelocale
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.0" version: "0.5.5"
diff_match_patch: diff_match_patch:
dependency: transitive dependency: transitive
description: description:
@ -322,14 +336,14 @@ packages:
name: equatable name: equatable
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.5"
extended_tabs: extended_tabs:
dependency: "direct main" dependency: "direct main"
description: description:
name: extended_tabs name: extended_tabs
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "4.0.1"
ezanimation: ezanimation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -343,14 +357,14 @@ packages:
name: fake_async name: fake_async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.3.1"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "2.0.1"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -364,133 +378,133 @@ packages:
name: firebase_analytics name: firebase_analytics
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "9.1.2" version: "10.0.1"
firebase_analytics_platform_interface: firebase_analytics_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_analytics_platform_interface name: firebase_analytics_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.1" version: "3.3.9"
firebase_analytics_web: firebase_analytics_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_analytics_web name: firebase_analytics_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0+8" version: "0.5.1"
firebase_auth: firebase_auth:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_auth name: firebase_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.3.11" version: "4.0.1"
firebase_auth_platform_interface: firebase_auth_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_auth_platform_interface name: firebase_auth_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.2.1" version: "6.10.3"
firebase_auth_web: firebase_auth_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_auth_web name: firebase_auth_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.3.9" version: "5.0.1"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_core name: firebase_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.13.1" version: "2.0.0"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_platform_interface name: firebase_core_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.5" version: "4.5.1"
firebase_core_web: firebase_core_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_web name: firebase_core_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.1" version: "2.0.0"
firebase_dynamic_links: firebase_dynamic_links:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_dynamic_links name: firebase_dynamic_links
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.1" version: "5.0.1"
firebase_dynamic_links_platform_interface: firebase_dynamic_links_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_dynamic_links_platform_interface name: firebase_dynamic_links_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.2+1" version: "0.2.3+17"
firebase_in_app_messaging: firebase_in_app_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_in_app_messaging name: firebase_in_app_messaging
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.0+9" version: "0.7.0+1"
firebase_in_app_messaging_platform_interface: firebase_in_app_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_in_app_messaging_platform_interface name: firebase_in_app_messaging_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.1+1" version: "0.2.1+21"
firebase_messaging: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_messaging name: firebase_messaging
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "11.2.11" version: "14.0.1"
firebase_messaging_platform_interface: firebase_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_platform_interface name: firebase_messaging_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.1" version: "4.2.2"
firebase_messaging_web: firebase_messaging_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_web name: firebase_messaging_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.9" version: "3.2.2"
firebase_remote_config: firebase_remote_config:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_remote_config name: firebase_remote_config
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "3.0.1"
firebase_remote_config_platform_interface: firebase_remote_config_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_remote_config_platform_interface name: firebase_remote_config_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.1.21"
firebase_remote_config_web: firebase_remote_config_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_remote_config_web name: firebase_remote_config_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.7" version: "1.1.10"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -498,13 +512,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
fl_chart:
dependency: "direct main"
description:
name: fl_chart
url: "https://pub.dartlang.org"
source: hosted
version: "0.50.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -523,28 +530,28 @@ packages:
name: flutter_bloc name: flutter_bloc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.0.1" version: "8.1.1"
flutter_facebook_auth: flutter_facebook_auth:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_facebook_auth name: flutter_facebook_auth
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.3.4" version: "4.4.1+1"
flutter_facebook_auth_platform_interface: flutter_facebook_auth_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: flutter_facebook_auth_platform_interface name: flutter_facebook_auth_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.2" version: "3.2.0"
flutter_facebook_auth_web: flutter_facebook_auth_web:
dependency: transitive dependency: transitive
description: description:
name: flutter_facebook_auth_web name: flutter_facebook_auth_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.2" version: "3.2.0"
flutter_fadein: flutter_fadein:
dependency: "direct main" dependency: "direct main"
description: description:
@ -580,6 +587,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.6" version: "1.0.6"
flutter_lints:
dependency: "direct main"
description:
name: flutter_lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_localizations: flutter_localizations:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -641,13 +655,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
flutter_smartlook:
dependency: "direct main"
description:
name: flutter_smartlook
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.9"
flutter_svg: flutter_svg:
dependency: transitive dependency: transitive
description: description:
@ -660,13 +667,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_uxcam:
dependency: "direct main"
description:
name: flutter_uxcam
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_web_plugins: flutter_web_plugins:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -706,14 +706,28 @@ packages:
name: google_sign_in name: google_sign_in
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.2.4" version: "5.4.2"
google_sign_in_android:
dependency: transitive
description:
name: google_sign_in_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.1"
google_sign_in_ios:
dependency: transitive
description:
name: google_sign_in_ios
url: "https://pub.dartlang.org"
source: hosted
version: "5.5.0"
google_sign_in_platform_interface: google_sign_in_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: google_sign_in_platform_interface name: google_sign_in_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.3.0"
google_sign_in_web: google_sign_in_web:
dependency: transitive dependency: transitive
description: description:
@ -741,7 +755,7 @@ packages:
name: http name: http
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.13.4" version: "0.13.5"
http_multi_server: http_multi_server:
dependency: transitive dependency: transitive
description: description:
@ -790,7 +804,7 @@ packages:
name: js name: js
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.4"
json_annotation: json_annotation:
dependency: transitive dependency: transitive
description: description:
@ -812,6 +826,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.2" version: "0.5.2"
lints:
dependency: transitive
description:
name: lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@ -832,21 +853,28 @@ packages:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.11" version: "0.12.12"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "0.1.5"
matomo_tracker:
dependency: "direct main"
description:
name: matomo_tracker
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.0" version: "1.8.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@ -860,7 +888,7 @@ packages:
name: mockito name: mockito
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.0" version: "5.3.2"
mocktail: mocktail:
dependency: transitive dependency: transitive
description: description:
@ -874,7 +902,7 @@ packages:
name: modal_progress_hud_nsn name: modal_progress_hud_nsn
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.0-nullsafety-1" version: "0.3.0"
nested: nested:
dependency: transitive dependency: transitive
description: description:
@ -923,14 +951,14 @@ packages:
name: package_info_plus name: package_info_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.4.0" version: "1.4.3+1"
package_info_plus_linux: package_info_plus_linux:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_linux name: package_info_plus_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.5"
package_info_plus_macos: package_info_plus_macos:
dependency: transitive dependency: transitive
description: description:
@ -951,21 +979,21 @@ packages:
name: package_info_plus_web name: package_info_plus_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.5"
package_info_plus_windows: package_info_plus_windows:
dependency: transitive dependency: transitive
description: description:
name: package_info_plus_windows name: package_info_plus_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "2.1.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.2"
path_drawing: path_drawing:
dependency: transitive dependency: transitive
description: description:
@ -1007,7 +1035,7 @@ packages:
name: path_provider_linux name: path_provider_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "2.1.7"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
@ -1028,7 +1056,7 @@ packages:
name: path_provider_windows name: path_provider_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.1.3"
percent_indicator: percent_indicator:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1133,21 +1161,21 @@ packages:
name: rxdart name: rxdart
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.27.3" version: "0.27.5"
sentry: sentry:
dependency: transitive dependency: transitive
description: description:
name: sentry name: sentry
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.4.0" version: "6.13.0"
sentry_flutter: sentry_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: sentry_flutter name: sentry_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.4.0" version: "6.13.0"
share: share:
dependency: transitive dependency: transitive
description: description:
@ -1161,7 +1189,7 @@ packages:
name: shared_preferences name: shared_preferences
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.13" version: "2.0.15"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
@ -1245,7 +1273,7 @@ packages:
name: sign_in_with_apple name: sign_in_with_apple
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.3.0" version: "4.1.0"
sign_in_with_apple_platform_interface: sign_in_with_apple_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1271,7 +1299,7 @@ packages:
name: source_gen name: source_gen
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "1.2.6"
source_map_stack_trace: source_map_stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1292,21 +1320,21 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.9.0"
sqflite: sqflite:
dependency: "direct main" dependency: "direct main"
description: description:
name: sqflite name: sqflite
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.1.0+1"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "2.3.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1320,7 +1348,7 @@ packages:
name: stop_watch_timer name: stop_watch_timer
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "2.0.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@ -1341,56 +1369,63 @@ packages:
name: string_scanner name: string_scanner
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.1"
sync_scroll_library:
dependency: transitive
description:
name: sync_scroll_library
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
syncfusion_flutter_calendar: syncfusion_flutter_calendar:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_flutter_calendar name: syncfusion_flutter_calendar
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
syncfusion_flutter_charts: syncfusion_flutter_charts:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_flutter_charts name: syncfusion_flutter_charts
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47+1" version: "20.3.50"
syncfusion_flutter_core: syncfusion_flutter_core:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_flutter_core name: syncfusion_flutter_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
syncfusion_flutter_datagrid: syncfusion_flutter_datagrid:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_flutter_datagrid name: syncfusion_flutter_datagrid
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
syncfusion_flutter_datepicker: syncfusion_flutter_datepicker:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_flutter_datepicker name: syncfusion_flutter_datepicker
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
syncfusion_flutter_gauges: syncfusion_flutter_gauges:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_flutter_gauges name: syncfusion_flutter_gauges
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
syncfusion_localizations: syncfusion_localizations:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_localizations name: syncfusion_localizations
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "20.1.47" version: "20.3.50"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@ -1404,28 +1439,28 @@ packages:
name: term_glyph name: term_glyph
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.1"
test: test:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: test name: test
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.19.5" version: "1.21.4"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.8" version: "0.4.12"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.9" version: "0.4.16"
timeline_tile: timeline_tile:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1439,7 +1474,7 @@ packages:
name: timezone name: timezone
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.0" version: "0.9.0"
timing: timing:
dependency: transitive dependency: transitive
description: description:
@ -1453,7 +1488,7 @@ packages:
name: toggle_switch name: toggle_switch
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.4.0" version: "2.0.1"
tuple: tuple:
dependency: transitive dependency: transitive
description: description:
@ -1482,20 +1517,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
universal_platform:
dependency: transitive
description:
name: universal_platform
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0+1"
upgrader: upgrader:
dependency: "direct main" dependency: "direct main"
description: description:
name: upgrader name: upgrader
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.13.0" version: "4.8.1"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.20" version: "6.1.6"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
@ -1530,7 +1572,7 @@ packages:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.1.1"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
@ -1558,7 +1600,7 @@ packages:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
version: version:
dependency: transitive dependency: transitive
description: description:
@ -1621,7 +1663,7 @@ packages:
name: wakelock name: wakelock
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.1+2" version: "0.6.2"
wakelock_macos: wakelock_macos:
dependency: transitive dependency: transitive
description: description:
@ -1719,7 +1761,7 @@ packages:
name: win32 name: win32
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.4.4" version: "2.7.0"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
@ -1742,5 +1784,5 @@ packages:
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
sdks: sdks:
dart: ">=2.16.0 <3.0.0" dart: ">=2.18.0-0 <3.0.0"
flutter: ">=2.10.0" flutter: ">=3.3.0-0"

View File

@ -18,77 +18,92 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.1.26+107 version: 1.1.26+107
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: ">=2.12.0 <3.9.0"
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
cupertino_icons: ^1.0.0
google_fonts: ^2.1.0
devicelocale: ^0.5.0
sentry_flutter: ^6.4.0
flutter_bloc: ^8.0.1
equatable: ^2.0.3
flutter_radar_chart: ^0.2.1
rainbow_color: ^2.0.1
percent_indicator: ^4.0.0
fl_chart: ^0.50.0
infinite_listview: ^1.1.0
toggle_switch: ^1.4.0
keyboard_actions: ^3.4.0
badges: ^2.0.1
stop_watch_timer: ^1.3.1
#location: ^3.2.4
modal_progress_hud_nsn: ^0.1.0-nullsafety-1
flutter_html: ^2.0.0
wakelock: ^0.6.1+2
timeline_tile: ^2.0.0
purchases_flutter: ^3.9.5
package_info: ^2.0.0
ezanimation: ^0.6.0
confetti: ^0.6.0
crypto: ^3.0.0
carousel_slider: ^4.0.0
convex_bottom_bar: ^3.0.0
flutter_app_badger: ^1.2.0
extended_tabs: ^2.2.0
upgrader: ^3.11.0
web_browser: ^0.5.0
flutter_fadein: ^2.0.0
mailto: ^2.0.0
url_launcher: ^6.0.9
firebase_core: ^1.10.5
firebase_analytics: ^9.1.2
firebase_messaging: ^11.2.11
firebase_auth: ^3.3.3
firebase_remote_config: ^2.0.2
firebase_dynamic_links: ^4.1.1
firebase_in_app_messaging: ^0.6.0+4
syncfusion_flutter_gauges: ^20.1.47
syncfusion_flutter_datagrid: ^20.1.47
syncfusion_flutter_charts: ^20.1.47
syncfusion_flutter_calendar: ^20.1.47
syncfusion_localizations: ^20.1.47
flutter_facebook_auth: ^4.3.4
google_sign_in: ^5.2.4
sign_in_with_apple: ^3.3.0
flutter_smartlook: ^3.0.9
#flurry_data: ^0.0.1
flutter_uxcam: ^2.0.1
animated_widgets: ^1.0.6 animated_widgets: ^1.0.6
flutter_fancy_tree_view: ^0.5.1+1
mockito: ^5.0.3 badges: ^2.0.1
sqflite: ^2.0.0+3
carousel_slider: ^4.0.0
confetti: ^0.6.0
convex_bottom_bar: ^3.0.0
crypto: ^3.0.0
cupertino_icons: ^1.0.0
equatable: ^2.0.5
extended_tabs: ^4.0.1
ezanimation: ^0.6.0
devicelocale: ^0.5.5
firebase_core: ^2.0.0
firebase_analytics: ^10.0.1
firebase_messaging: ^14.0.1
firebase_auth: ^4.0.1
firebase_remote_config: ^3.0.1
firebase_dynamic_links: ^5.0.1
firebase_in_app_messaging: ^0.7.0+1
flutter_app_badger: ^1.2.0
flutter_bloc: ^8.1.1
flutter_html: ^2.0.0
flutter_fancy_tree_view: ^0.5.1+1
flutter_facebook_auth: ^4.4.1+1
flutter_fadein: ^2.0.0
flutter_lints: ^2.0.1
flutter_radar_chart: ^0.2.1
flutter_secure_storage: ^5.0.2 flutter_secure_storage: ^5.0.2
#flutter_smartlook: ^4.0.1
google_fonts: ^2.1.0
google_sign_in: ^5.4.2
infinite_listview: ^1.1.0
keyboard_actions: ^3.4.0
mailto: ^2.0.0
matomo_tracker: ^1.5.0
mockito: ^5.3.2
modal_progress_hud_nsn: ^0.3.0
package_info: ^2.0.2
percent_indicator: ^4.0.0
purchases_flutter: ^3.9.5
rainbow_color: ^2.0.1
sentry_flutter: ^6.13.0
sign_in_with_apple: ^4.1.0
sqflite: ^2.1.0+1
stop_watch_timer: ^2.0.0
syncfusion_flutter_gauges: ^20.3.50
syncfusion_flutter_datagrid: ^20.3.50
syncfusion_flutter_charts: ^20.3.50
syncfusion_flutter_calendar: ^20.3.50
syncfusion_localizations: ^20.3.50
timeline_tile: ^2.0.0
toggle_switch: ^2.0.1
upgrader: ^4.8.1
url_launcher: ^6.0.9
wakelock: ^0.6.2
web_browser: ^0.5.0
#fl_chart: ^0.50.0
#location: ^3.2.4
#flurry_data: ^0.0.1
#flutter_uxcam: ^2.1.5
#social_share: ^2.1.1 #social_share: ^2.1.1
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
@ -100,7 +115,7 @@ dev_dependencies:
test: '>=1.0.0 <2.0.0' test: '>=1.0.0 <2.0.0'
flutter_test: flutter_test:
sdk: flutter sdk: flutter
bloc_test: ^9.0.3 bloc_test: ^9.1.0
build_runner: build_runner: