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
}
android {
compileSdkVersion 33
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']

View File

@ -5,18 +5,10 @@
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="${applicationName}"
android:label="WorkoutTest"
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">
<application android:name="${applicationName}" android:label="WorkoutTest" android:icon="@mipmap/launcher_icon">
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
<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
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
@ -65,4 +57,7 @@
</intent-filter>
</activity>
</application>
<queries>
<provider android:authorities="com.facebook.katana.provider.PlatformProvider" />
</queries>
</manifest>

View File

@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WorkoutTest</string>
<string name="app_name">WorkoutTest</string>
<!-- Replace "000000000000" with your Facebook App ID here. -->
<string name="facebook_app_id">584181112271127</string>
<!-- Replace "000000000000" with your Facebook App ID here. -->
<string name="facebook_app_id">584181112271127</string>
<string name="facebook_client_token">60d565f451ce32de3d7eeb26274bbddd</string>
<!--
<!--
Replace "000000000000" with your Facebook App ID here.
**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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -54,10 +54,11 @@ import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.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:matomo_tracker/matomo_tracker.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 'bloc/account/account_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 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');
}
@ -146,7 +148,12 @@ Future<Null> main() async {
Future<void> initThirdParty() async {
if (!isInDebugMode) {
//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();
}
@ -154,11 +161,11 @@ Future<Null> main() async {
final WorkoutTreeRepository menuTreeRepository = WorkoutTreeRepository();
WidgetsFlutterBinding.ensureInitialized();
if (!isInDebugMode) {
FlutterUxcam.startWithKey("wvdstyoml4tiwfd");
//FlutterUxcam.startWithKey("wvdstyoml4tiwfd");
SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build();
Smartlook.setupAndStartRecording(options);
Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING);
//SetupOptions options = (new SetupOptionsBuilder('682883e5cd71a46160c4f6ed070530ee593f49c6')).build();
//Smartlook.setupAndStartRecording(options);
//Smartlook.setEventTrackingMode(EventTrackingMode.FULL_TRACKING);
}
await initThirdParty();
final FirebaseAnalytics analytics = FirebaseAnalytics.instance;
@ -194,7 +201,8 @@ Future<Null> main() async {
BlocProvider<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) {
final MenuBloc menuBloc = BlocProvider.of<MenuBloc>(context);
return TrainingPlanBloc(menuBloc: menuBloc, trainingPlanRepository: TrainingPlanRepository());
@ -216,9 +224,6 @@ class WorkoutTestApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// Only call clearSavedSettings() during testing to reset internal values.
Upgrader().clearSavedSettings(); // REMOVE this for release builds
Upgrader().installAppStoreListingURL(Platform.isAndroid
? "https://play.google.com/store/apps/details?id=com.aitrainer.aitrainer_app"
: "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:flurry_data/flurry_data.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:shared_preferences/shared_preferences.dart';
import 'package:aitrainer_app/model/exercise_type.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 'exercise_device.dart';
@ -175,7 +176,7 @@ class Cache with Logging {
List<Exercise>? _exercisesTrainee;
ExercisePlan? _traineeExercisePlan;
RemoteConfig? remoteConfig;
FirebaseRemoteConfig? remoteConfig;
LinkedHashMap<String, int> _badges = LinkedHashMap();
@ -544,7 +545,8 @@ class Cache with Logging {
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;
@ -558,7 +560,8 @@ class Cache with Logging {
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) {
this._myExercisesPlanDetails[exerciseTypeId]!.change = ModelChange.delete;
@ -686,14 +689,21 @@ class Cache with Logging {
Future<void> initCustomer(int customerId) async {
log(" *** initCustomer");
await PackageApi().getCustomerPackage(customerId);
try {
await PackageApi().getCustomerPackage(customerId);
} on Exception catch (_) {
return;
}
if (!isInDebugMode) {
//FlurryData.setUserId(customerId.toString());
FlutterUxcam.setUserProperty("username", customerId.toString());
FlutterUxcam.setUserIdentity(customerId.toString());
Smartlook.setUserIdentifier(customerId.toString());
//FlutterUxcam.setUserProperty("username", customerId.toString());
//FlutterUxcam.setUserIdentity(customerId.toString());
//Smartlook.setUserIdentifier(customerId.toString());
//Smartlook.instance.
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 {
@ -751,8 +761,8 @@ class Cache with Logging {
List<Tutorial>? get tutorials => this._tutorials;
setTutorials(List<Tutorial>? value) => this._tutorials = value;
RemoteConfig? getRemoteConfig() => this.remoteConfig;
setRemoteConfig(RemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig;
FirebaseRemoteConfig? getRemoteConfig() => this.remoteConfig;
setRemoteConfig(FirebaseRemoteConfig? remoteConfig) => this.remoteConfig = remoteConfig;
List<Description>? getDescriptions() => this._descriptions;
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:firebase_remote_config/firebase_remote_config.dart';
class RemoteConfigRepository with Logging {
RemoteConfig? remoteConfig;
FirebaseRemoteConfig? remoteConfig;
String getConfigValue(String configKey, String baseValue) {
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:firebase_remote_config/firebase_remote_config.dart';
class SplitTestRepository with Logging {
final RemoteConfig? _remoteConfig = Cache().remoteConfig;
final FirebaseRemoteConfig? _remoteConfig = Cache().remoteConfig;
final DescriptionRepository descriptionRepository = DescriptionRepository();
String getSplitTestValue(String remoteConfigKey) {

View File

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

View File

@ -44,62 +44,44 @@ class PackageApi {
final List<String> headRecord = element.split("***");
final Iterable json = jsonDecode(headRecord[1]);
if (headRecord[0] == "ExerciseDevice") {
final List<ExerciseDevice> devices =
json.map((device) => ExerciseDevice.fromJson(device)).toList();
final List<ExerciseDevice> devices = json.map((device) => ExerciseDevice.fromJson(device)).toList();
Cache().setDevices(devices);
} else if (headRecord[0] == "Product") {
final List<Product> products =
json.map((product) => Product.fromJson(product)).toList();
final List<Product> products = json.map((product) => Product.fromJson(product)).toList();
Cache().setProducts(products);
} else if (headRecord[0] == "Property") {
final List<Property> properties =
json.map((property) => Property.fromJson(property)).toList();
final List<Property> properties = json.map((property) => Property.fromJson(property)).toList();
Cache().setProperties(properties);
} else if (headRecord[0] == "ExerciseTree") {
exerciseTree = json
.map((exerciseTree) => ExerciseTree.fromJson(exerciseTree))
.toList();
exerciseTree = json.map((exerciseTree) => ExerciseTree.fromJson(exerciseTree)).toList();
} else if (headRecord[0] == "ExerciseType") {
final List<ExerciseType> exerciseTypes = json
.map((exerciseType) => ExerciseType.fromJson(exerciseType))
.toList();
final List<ExerciseType> exerciseTypes = json.map((exerciseType) => ExerciseType.fromJson(exerciseType)).toList();
await Future.forEach(exerciseTypes, (elem) async {
final ExerciseType exerciseType = elem as ExerciseType;
exerciseType.imageUrl = await ExerciseTypeApi()
.buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId);
exerciseType.imageUrl = await ExerciseTypeApi().buildImage(exerciseType.imageUrl, exerciseType.exerciseTypeId);
});
Cache().setExerciseTypes(exerciseTypes);
} else if (headRecord[0] == "ExerciseAbility") {
} else if (headRecord[0] == "ExercisePlanTemplate") {
final List<ExercisePlanTemplate> exercisePlanTemplates = json
.map((exercisePlanTemplate) =>
ExercisePlanTemplate.fromJson(exercisePlanTemplate))
.toList();
final List<ExercisePlanTemplate> exercisePlanTemplates =
json.map((exercisePlanTemplate) => ExercisePlanTemplate.fromJson(exercisePlanTemplate)).toList();
Cache().setExercisePlanTemplates(exercisePlanTemplates);
} else if (headRecord[0] == "ExerciseTreeParents") {
exerciseTreeParents = json
.map((exerciseTreeParent) =>
ExerciseTreeParents.fromJson(exerciseTreeParent))
.toList();
exerciseTreeParents = json.map((exerciseTreeParent) => ExerciseTreeParents.fromJson(exerciseTreeParent)).toList();
} else if (headRecord[0] == "Evaluation") {
final List<Evaluation> evaluations =
json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
final List<Evaluation> evaluations = json.map((evaluation) => Evaluation.fromJson(evaluation)).toList();
Cache().evaluations = evaluations;
} else if (headRecord[0] == "Sport") {
final List<Sport> sports =
json.map((sport) => Sport.fromJson(sport)).toList();
final List<Sport> sports = json.map((sport) => Sport.fromJson(sport)).toList();
Cache().setSports(sports);
} else if (headRecord[0] == "Tutorial") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Tutorial> tutorials =
json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
final List<Tutorial> tutorials = json.map((tutorial) => Tutorial.fromJson(tutorial)).toList();
Cache().setTutorials(tutorials);
} else if (headRecord[0] == "Description") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Description>? descriptions = json
.map((description) => Description.fromJson(description))
.toList();
final List<Description>? descriptions = json.map((description) => Description.fromJson(description)).toList();
//print("Description: $descriptions");
Cache().setDescriptions(descriptions);
} else if (headRecord[0] == "Faq") {
@ -109,8 +91,7 @@ class PackageApi {
Cache().setFaqs(faqs);
} else if (headRecord[0] == "TrainingPlan") {
final Iterable json = jsonDecode(headRecord[1]);
final List<TrainingPlan>? plans =
json.map((plan) => TrainingPlan.fromJson(plan)).toList();
final List<TrainingPlan>? plans = json.map((plan) => TrainingPlan.fromJson(plan)).toList();
List<TrainingPlan> activePlans = [];
if (plans != null) {
@ -123,38 +104,31 @@ class PackageApi {
Cache().setTrainingPlans(activePlans);
} else if (headRecord[0] == "SplitTests") {
final Iterable json = jsonDecode(headRecord[1]);
final List<SplitTest>? tests =
json.map((test) => SplitTest.fromJson(test)).toList();
final List<SplitTest>? tests = json.map((test) => SplitTest.fromJson(test)).toList();
//print("A/B tests: $tests");
Cache().setSplitTests(tests);
} else if (headRecord[0] == "TrainingPlanDay") {
final Iterable json = jsonDecode(headRecord[1]);
final List<TrainingPlanDay>? days =
json.map((day) => TrainingPlanDay.fromJson(day)).toList();
final List<TrainingPlanDay>? days = json.map((day) => TrainingPlanDay.fromJson(day)).toList();
Cache().setTrainingPlanDays(days);
}
});
exerciseTree =
this.getExerciseTreeParents(exerciseTree, exerciseTreeParents);
exerciseTree = this.getExerciseTreeParents(exerciseTree, exerciseTreeParents);
await Future.forEach(exerciseTree, (element) async {
ExerciseTree tree = element as ExerciseTree;
tree.imageUrl =
await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId);
tree.imageUrl = await ExerciseTreeApi().buildImage(tree.imageUrl, tree.treeId);
});
Cache().setExerciseTree(exerciseTree);
TrainingPlanDayRepository trainingPlanDayRepository =
TrainingPlanDayRepository();
TrainingPlanDayRepository trainingPlanDayRepository = TrainingPlanDayRepository();
trainingPlanDayRepository.assignTrainingPlanDays();
return;
}
List<ExerciseTree> getExerciseTreeParents(
final List<ExerciseTree> exerciseTree,
final List<ExerciseTreeParents> exerciseTreeParents) {
List<ExerciseTree> getExerciseTreeParents(final List<ExerciseTree> exerciseTree, final List<ExerciseTreeParents> exerciseTreeParents) {
List<ExerciseTree> copyList = ExerciseTreeApi().copyList(exerciseTree);
int treeIndex = 0;
@ -184,8 +158,7 @@ class PackageApi {
Future<void> getCustomerPackage(int customerId) async {
try {
final body = await _client.get(
"app_customer_package/" + customerId.toString(), "");
final body = await _client.get("app_customer_package/" + customerId.toString(), "");
final List<String> models = body.split("|||");
await Future.forEach(models, (elem) async {
@ -197,33 +170,24 @@ class PackageApi {
Cache().userLoggedIn = customer;
} else if (headRecord[0] == "CustomerExerciseDevice") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerExerciseDevice> devices = json
.map((device) => CustomerExerciseDevice.fromJson(device))
.toList();
final List<CustomerExerciseDevice> devices = json.map((device) => CustomerExerciseDevice.fromJson(device)).toList();
Cache().setCustomerDevices(devices);
// ToDo
} else if (headRecord[0] == "Exercises") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Exercise> exercises = json
.map((exerciseType) => Exercise.fromJson(exerciseType))
.toList();
final List<Exercise> exercises = json.map((exerciseType) => Exercise.fromJson(exerciseType)).toList();
Cache().setExercises(exercises);
} else if (headRecord[0] == "Purchase") {
final Iterable json = jsonDecode(headRecord[1]);
final List<Purchase> purchases =
json.map((purchase) => Purchase.fromJson(purchase)).toList();
final List<Purchase> purchases = json.map((purchase) => Purchase.fromJson(purchase)).toList();
Cache().setPurchases(purchases);
} else if (headRecord[0] == "CustomerProperty") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> customerProperties = json
.map((property) => CustomerProperty.fromJson(property))
.toList();
final List<CustomerProperty> customerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList();
CustomerApi().initProperties(customerProperties);
} else if (headRecord[0] == "CustomerPropertyAll") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerProperty> allCustomerProperties = json
.map((property) => CustomerProperty.fromJson(property))
.toList();
final List<CustomerProperty> allCustomerProperties = json.map((property) => CustomerProperty.fromJson(property)).toList();
print(" All Properties ---- $allCustomerProperties");
Cache().setCustomerPropertyAll(allCustomerProperties);
} else if (headRecord[0] == "ExerciseResult") {
@ -235,14 +199,12 @@ class PackageApi {
// ToDo */
} else if (headRecord[0] == "CustomerActivity") {
final Iterable json = jsonDecode(headRecord[1]);
final List<CustomerActivity> customerActivities = json
.map((activity) => CustomerActivity.fromJson(activity))
.toList();
final List<CustomerActivity> customerActivities = json.map((activity) => CustomerActivity.fromJson(activity)).toList();
Cache().setCustomerActivities(customerActivities);
}
});
} on NotFoundException catch (_) {
throw Exception("Please log in");
} on NotFoundException catch (e) {
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_messaging/firebase_messaging.dart';
//import 'package:flurry_data/flurry_data.dart';
import 'package:flutter_uxcam/flutter_uxcam.dart';
import 'package:flutter_smartlook/flutter_smartlook.dart';
//import 'package:flutter_uxcam/flutter_uxcam.dart';
//import 'package:flutter_smartlook/flutter_smartlook.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
class Track with Logging {
static final Track _singleton = Track._internal();
@ -23,8 +24,8 @@ class Track with Logging {
void track(TrackingEvent event, {String eventValue = ""}) {
if (!isInDebugMode) {
//FlurryData.logEvent(event.enumToString());
Smartlook.setGlobalEventProperty(event.toString(), eventValue, false);
FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue});
//Smartlook.setGlobalEventProperty(event.toString(), eventValue, false);
//FlutterUxcam.logEventWithProperties(event.enumToString(), {"value": eventValue});
model.Tracking tracking = model.Tracking();
tracking.customerId = Cache().userLoggedIn == null ? 0 : Cache().userLoggedIn!.customerId!;
tracking.event = event.enumToString();
@ -37,6 +38,7 @@ class Track with Logging {
FirebaseMessaging.instance.subscribeToTopic(event.enumToString());
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(
key: _scaffoldKey,
body: UpgradeAlert(
appcastConfig: cfg,
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),
upgrader: Upgrader(appcastConfig: cfg, messages: MyLocalizedUpgraderMessages(context: context)),
child: BlocConsumer<SessionBloc, SessionState>(listener: (context, state) {
if (state is SessionFailure) {
showDialog(
@ -148,6 +138,8 @@ class MyLocalizedUpgraderMessages extends UpgraderMessages with Trans {
return t('Want to update?');
case UpgraderMessage.title:
return t('Update App?');
case UpgraderMessage.releaseNotes:
return "";
}
// Messages that are not provided above can still use the default values.

View File

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

View File

@ -18,78 +18,93 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.1.26+107
environment:
sdk: ">=2.12.0 <3.0.0"
sdk: ">=2.12.0 <3.9.0"
dependencies:
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
animated_widgets: ^1.0.6
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
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
extended_tabs: ^2.2.0
upgrader: ^3.11.0
web_browser: ^0.5.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_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
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
wakelock: ^0.6.2
web_browser: ^0.5.0
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
#fl_chart: ^0.50.0
#location: ^3.2.4
#flurry_data: ^0.0.1
flutter_uxcam: ^2.0.1
animated_widgets: ^1.0.6
flutter_fancy_tree_view: ^0.5.1+1
mockito: ^5.0.3
sqflite: ^2.0.0+3
flutter_secure_storage: ^5.0.2
#flutter_uxcam: ^2.1.5
#social_share: ^2.1.1
flutter_localizations:
sdk: flutter
@ -100,7 +115,7 @@ dev_dependencies:
test: '>=1.0.0 <2.0.0'
flutter_test:
sdk: flutter
bloc_test: ^9.0.3
bloc_test: ^9.1.0
build_runner: