From 78eb620f6cc2629fde5a5abf3b52a121f2f75c77 Mon Sep 17 00:00:00 2001 From: Ayush Sourav Jagaty Date: Sun, 5 Jan 2025 12:20:05 +0530 Subject: [PATCH] having issue in shared Preferences --- .vscode/settings.json | 1 + lib/helpers/gym_mode.dart | 1 - lib/l10n/app_en.arb | 1 + lib/main.dart | 3 +- lib/providers/plate_weights.dart | 85 ++++++++++++------ lib/providers/user.dart | 12 ++- lib/screens/add_plate_weights.dart | 140 ++++++++++++++++++++--------- lib/widgets/workouts/gym_mode.dart | 115 ++++++++++++------------ 8 files changed, 229 insertions(+), 129 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9619dd65b..585ffee37 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "dart.lineLength": 100, "diffEditor.ignoreTrimWhitespace": true, + "cmake.sourceDirectory": "/Users/ayush/flutter/linux", } diff --git a/lib/helpers/gym_mode.dart b/lib/helpers/gym_mode.dart index 6f634c2b2..7741147a0 100644 --- a/lib/helpers/gym_mode.dart +++ b/lib/helpers/gym_mode.dart @@ -19,7 +19,6 @@ /// Calculates the number of plates needed to reach a specific weight List plateCalculator(num totalWeight, num barWeight, List plates) { final List ans = []; - print("total weight is $totalWeight"); // Weight is less than the bar if (totalWeight < barWeight) { return []; diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 33108f7dd..6b89006a7 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -37,6 +37,7 @@ "@passwordTooShort": { "description": "Error message when the user a password that is too short" }, + "selectAvailablePlates": "Select Available Plates", "password": "Password", "@password": {}, "confirmPassword": "Confirm password", diff --git a/lib/main.dart b/lib/main.dart index 019865165..5c344a4dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:wger/core/locator.dart'; import 'package:wger/providers/add_exercise.dart'; import 'package:wger/providers/base_provider.dart'; @@ -57,10 +58,8 @@ import 'providers/auth.dart'; void main() async { //zx.setLogEnabled(kDebugMode); - // Needs to be called before runApp WidgetsFlutterBinding.ensureInitialized(); - // Locator to initialize exerciseDB await ServiceLocator().configure(); // Application diff --git a/lib/providers/plate_weights.dart b/lib/providers/plate_weights.dart index d50d8cb39..47d2df487 100644 --- a/lib/providers/plate_weights.dart +++ b/lib/providers/plate_weights.dart @@ -1,9 +1,12 @@ +import 'dart:convert'; import 'package:flutter/widgets.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:wger/helpers/gym_mode.dart'; class PlateWeights extends ChangeNotifier{ - String unitOfPlate = 'kg'; - bool flag = false; + bool isMetric = true; + bool plateChoiceExists = false; + bool loadedFromSharedPref = false; num totalWeight = 0; num barWeight = 20; num convertTolbs = 2.205; @@ -14,39 +17,68 @@ class PlateWeights extends ChangeNotifier{ List lbsWeights = [2.5, 5, 10, 25, 35, 45]; List customPlates = []; late Map grouped; + List get data => selectedWeights; + set data(List newData){ + selectedWeights = newData; + //saving data to shared preference + saveIntoSharedPrefs(); + notifyListeners(); + } + Future saveIntoSharedPrefs() async{ + final pref = await SharedPreferences.getInstance(); + //converting List Weights to String + final String selectedPlates = jsonEncode(selectedWeights); + pref.setString('selectedPlates', selectedPlates); + notifyListeners(); + } + + void readPlates() async{ + final pref = await SharedPreferences.getInstance(); + final platePrefData = pref.getString('selectedPlates'); + if(platePrefData != null){ + try{ + final plateData = json.decode(platePrefData); + if(plateData is List){ + selectedWeights = plateData.cast(); + }else{ + throw const FormatException('Not a List'); + } + }catch(e){ + selectedWeights = []; + } + } + print('loaded'); + notifyListeners(); + } + + Future toggleSelection(num x) async{ + if(selectedWeights.contains(x)) { + selectedWeights.remove(x); + }else { + selectedWeights.add(x); + } + final prefs = await SharedPreferences.getInstance(); + prefs.setString('selectedPlates',jsonEncode(selectedWeights)); + notifyListeners(); + } void unitChange() { - if(unitOfPlate=='lbs') { + if(isMetric==false) { totalWeight = totalWeightInKg; - unitOfPlate = 'kg'; + isMetric = true; barWeight = barWeightInKg; } else { - unitOfPlate = 'lbs'; + isMetric = false; totalWeight = totalWeightInKg*2.205; barWeight = barWeightInKg*2.205; } notifyListeners(); } - void toggleSelection(num x) { - if(unitOfPlate == 'kg') { - if(selectedWeights.contains(x)) { - selectedWeights.remove(x); - } else { - selectedWeights.add(x); - } - } else { - if(selectedWeights.contains(x)) { - selectedWeights.remove(x); - } else { - selectedWeights.add(x); - } - } - notifyListeners(); - } - - void clear() { + void clear() async{ selectedWeights.clear(); + final prefs = await SharedPreferences.getInstance(); + prefs.setString('selectedPlates',jsonEncode(selectedWeights)); notifyListeners(); } @@ -63,8 +95,11 @@ class PlateWeights extends ChangeNotifier{ notifyListeners(); } - void resetPlates() { + void resetPlates() async{ selectedWeights = []; + final prefs = await SharedPreferences.getInstance(); + prefs.setString('selectedPlates',jsonEncode(selectedWeights)); notifyListeners(); - } + } + } \ No newline at end of file diff --git a/lib/providers/user.dart b/lib/providers/user.dart index cb547c49d..b89102a4d 100644 --- a/lib/providers/user.dart +++ b/lib/providers/user.dart @@ -19,6 +19,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:path/path.dart'; import 'package:wger/models/user/profile.dart'; import 'package:wger/providers/base_provider.dart'; @@ -35,7 +37,15 @@ class UserProvider with ChangeNotifier { void clear() { profile = null; } - + // change the unit of plates + void unitChange(){ + if(profile?.weightUnitStr == 'kg'){ + profile?.weightUnitStr = 'lb'; + }else{ + profile?.weightUnitStr = 'kg'; + } + ChangeNotifier(); + } /// Fetch the current user's profile Future fetchAndSetProfile() async { final userData = await baseProvider.fetch(baseProvider.makeUrl(PROFILE_URL)); diff --git a/lib/screens/add_plate_weights.dart b/lib/screens/add_plate_weights.dart index 4e659dace..3a430cadc 100644 --- a/lib/screens/add_plate_weights.dart +++ b/lib/screens/add_plate_weights.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_html/flutter_html.dart'; import 'package:provider/provider.dart'; import 'package:wger/providers/plate_weights.dart'; +import 'package:wger/providers/user.dart'; class AddPlateWeights extends StatefulWidget { const AddPlateWeights({super.key}); @@ -9,26 +12,65 @@ class AddPlateWeights extends StatefulWidget { State createState() => _AddPlateWeightsState(); } -class _AddPlateWeightsState extends State { +class _AddPlateWeightsState extends State with SingleTickerProviderStateMixin{ +late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_){ + Provider.of(context,listen: false).readPlates(); + }); + _controller = AnimationController( + vsync: this, + duration: Duration(seconds: 1), + ); + _animation = Tween( + begin: const Offset(-1.0, 0.0), // Start off-screen + end: const Offset(0.0, 0.0), // End at original position + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )); + + _controller.forward(); // Start the animation + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } @override Widget build(BuildContext context) { - return Consumer ( - builder:(context,plateProvider,child)=> Scaffold ( + bool unit = true; + return Consumer2 ( + builder:(context,plateProvider,userProvider,child)=> Scaffold ( appBar: AppBar ( - title: const Text('Enter Custom Plate Weights'), + title: const Text('Select Available Plates'), ), body: Column ( children: [ Row ( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text('Kg or lbs'), + const Text('Preferred Unit'), DropdownButton ( onChanged: (newValue){ plateProvider.clear(); - if((newValue!) != plateProvider.unitOfPlate) { - plateProvider.unitChange(); + if(newValue=='kg') { + unit = true; + } else { + unit = false; + } + print(unit); + if(unit != userProvider.profile?.isMetric) { + userProvider.unitChange(); + //plateProvider.unitChange(); + _controller.reset(); + _controller.forward(); } }, items: ['kg','lbs'].map((unit){ @@ -43,46 +85,58 @@ class _AddPlateWeightsState extends State { SingleChildScrollView ( scrollDirection: Axis.horizontal, child: Row ( - children: plateProvider.unitOfPlate == 'kg' + children: (userProvider.profile?.weightUnitStr == 'kg') ? plateProvider.kgWeights.map((number) { - return GestureDetector( - onTap: () => plateProvider.toggleSelection(number), - child: Container ( - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(16), - decoration: BoxDecoration ( - color: plateProvider.selectedWeights.contains(number) - ? const Color.fromARGB(255, 82, 226, 236) - : const Color.fromARGB(255, 97, 105, 101), - borderRadius: BorderRadius.circular(10), - ), - child: Text ( - '$number kg', // Add unit to text - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + return SlideTransition( + position: _animation, + child: GestureDetector( + onTap: () => plateProvider.toggleSelection(number), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container ( + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration ( + color: plateProvider.selectedWeights.contains(number) + ? const Color.fromARGB(255, 82, 226, 236) + : const Color.fromARGB(255, 97, 105, 101), + borderRadius: BorderRadius.circular(10), + ), + child: Text ( + '$number kg', // Add unit to text + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), ), ), ), ); }).toList() : plateProvider.lbsWeights.map((number) { - return GestureDetector( - onTap: () => plateProvider.toggleSelection(number), - child: Container( - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(16), - decoration: BoxDecoration ( - color: plateProvider.selectedWeights.contains(number) - ? const Color.fromARGB(255, 82, 226, 236) - : const Color.fromARGB(255, 97, 105, 101), - borderRadius: BorderRadius.circular(10), - ), - child: Text ( - '$number lbs', // Add unit to text - style: const TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, + return SlideTransition( + position: _animation, + child: GestureDetector( + onTap: () => plateProvider.toggleSelection(number), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration ( + color: plateProvider.selectedWeights.contains(number) + ? const Color.fromARGB(255, 82, 226, 236) + : const Color.fromARGB(255, 97, 105, 101), + borderRadius: BorderRadius.circular(10), + ), + child: Text ( + '$number lbs', // Add unit to text + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), ), ), ), @@ -95,9 +149,11 @@ class _AddPlateWeightsState extends State { children: [ TextButton( onPressed: (){ + plateProvider.saveIntoSharedPrefs(); if(plateProvider.selectedWeights.isNotEmpty){ - plateProvider.flag=true; - plateProvider.calculatePlates();} + plateProvider.plateChoiceExists=true; + plateProvider.calculatePlates(); + } Navigator.pop(context); }, child: const Text('Done'), diff --git a/lib/widgets/workouts/gym_mode.dart b/lib/widgets/workouts/gym_mode.dart index 0611eb60f..ab9cf84ba 100644 --- a/lib/widgets/workouts/gym_mode.dart +++ b/lib/widgets/workouts/gym_mode.dart @@ -16,12 +16,14 @@ * along with this program. If not, see . */ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:wger/exceptions/http_exception.dart'; import 'package:wger/helpers/consts.dart'; import 'package:wger/helpers/gym_mode.dart'; @@ -262,15 +264,15 @@ class _LogPageState extends State { late FocusNode focusNode; @override - void initState() { + void initState(){ super.initState(); - + // WidgetsBinding.instance.addPostFrameCallback((_){ + // Provider.of(context,listen: false).readPlates(); + // }); focusNode = FocusNode(); - if (widget._setting.reps != null) { _repsController.text = widget._setting.reps.toString(); } - if (widget._setting.weight != null) { _weightController.text = widget._setting.weight.toString(); } @@ -555,71 +557,68 @@ class _LogPageState extends State { } Widget getPlates() { + print('get plates'); final plates = plateCalculator(num.parse(_weightController.text),BAR_WEIGHT,AVAILABLE_PLATES); Map groupedPlates; groupedPlates = groupPlates(plates); - return Consumer(builder: (context,plateProvider, child) => - SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ElevatedButton(onPressed: () { - plateProvider.flag=false; - plateProvider.setWeight(num.parse(_weightController.text)); - Navigator.of(context).push(MaterialPageRoute(builder: (context)=>const AddPlateWeights())); - }, - child: const Text("Enter custom Denomination's") - ), - const Padding(padding: EdgeInsets.all(10)), - ], - ), - SizedBox ( - height: 35, - child: (plateProvider.flag?plateProvider.selectedWeights.isNotEmpty:plates.isNotEmpty) - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text ('Plates:-',style: TextStyle(),), - ...(plateProvider.flag?plateProvider.grouped:groupedPlates).keys.map( - (key) => Row ( - children: [ - Text(plateProvider.flag?(plateProvider.grouped[key].toString()):(groupedPlates[key].toString())), - const Text('×'), - Container ( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primaryContainer, - shape: BoxShape.circle, - ), - child: Padding ( - padding: const EdgeInsets.symmetric(horizontal: 3), - child: SizedBox ( - height: 35, - width: 35, - child: Align ( - alignment: Alignment.center, - child: Text ( - key.toString(), - style: const TextStyle(fontWeight: FontWeight.bold,), + return Consumer( + builder: (context, plateProvider , child)=> + SingleChildScrollView( + child: Column( + children: [ + SizedBox ( + height: 35, + child: (plateProvider.plateChoiceExists?plateProvider.selectedWeights.isNotEmpty:plates.isNotEmpty) + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + onPressed: (){ + plateProvider.plateChoiceExists=false; + plateProvider.setWeight(num.parse(_weightController.text)); + Navigator.of(context).push(MaterialPageRoute(builder: (context)=>const AddPlateWeights())); + }, + icon: const Icon(Icons.settings), + ), + const Text ('Plates:-',style: TextStyle(),), + ...(plateProvider.plateChoiceExists?plateProvider.grouped:groupedPlates).keys.map( + (key) => Row ( + children: [ + Text(plateProvider.plateChoiceExists?(plateProvider.grouped[key].toString()):(groupedPlates[key].toString())), + const Text('×'), + Container ( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + shape: BoxShape.circle, + ), + child: Padding ( + padding: const EdgeInsets.symmetric(horizontal: 3), + child: SizedBox ( + height: 35, + width: 35, + child: Align ( + alignment: Alignment.center, + child: Text ( + key.toString(), + style: const TextStyle(fontWeight: FontWeight.bold,), + ), ), ), ), ), + const SizedBox(width: 10), + ], ), - const SizedBox(width: 10), - ], ), + ], + ) + : MutedText ( + AppLocalizations.of(context).plateCalculatorNotDivisible, ), - ], - ) - : MutedText ( - AppLocalizations.of(context).plateCalculatorNotDivisible, - ), - ), - ], + ), + ], + ), ), - ), ); }