From dcef0cf99d6b73d83fea12cb88fb2c668c85955b Mon Sep 17 00:00:00 2001 From: Syaroful Date: Wed, 6 Nov 2024 08:33:29 +0700 Subject: [PATCH] refactor: tidy up the ui --- .../core/widgets/error_data_state_widget.dart | 30 +++++++++++ .../widgets/no_data_state_widget.dart} | 18 ++++--- .../features/auth/provider/auth_provider.dart | 52 +++++++++---------- .../view/conductivity_screen.dart | 7 +-- .../nitrogen/view/nitrogen_screen.dart | 7 +-- .../home/detail_pages/ph/view/ph_screen.dart | 7 +-- .../phosphorus/view/phosphorus_screen.dart | 7 +-- .../potassium/view/potassium_screen.dart | 7 +-- .../view/soil_moisture_screen.dart | 7 +-- .../view/soil_temperature_screen.dart | 7 +-- .../temperature/view/temperature_screen.dart | 38 ++------------ .../widgets/list_data_from_censor_dht.dart | 4 +- .../widgets/list_data_from_censor_npk1.dart | 3 ++ .../widgets/list_data_from_censor_npk2.dart | 5 +- 14 files changed, 111 insertions(+), 88 deletions(-) create mode 100644 agrilink_vocpro/lib/core/widgets/error_data_state_widget.dart rename agrilink_vocpro/lib/{features/home/widgets/graphic_error_widget.dart => core/widgets/no_data_state_widget.dart} (59%) diff --git a/agrilink_vocpro/lib/core/widgets/error_data_state_widget.dart b/agrilink_vocpro/lib/core/widgets/error_data_state_widget.dart new file mode 100644 index 0000000..0cb21a3 --- /dev/null +++ b/agrilink_vocpro/lib/core/widgets/error_data_state_widget.dart @@ -0,0 +1,30 @@ +import 'package:agrilink_vocpro/core/constant/app_theme.dart'; +import 'package:bootstrap_icons/bootstrap_icons.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class ErrorDataStateWidget extends StatelessWidget { + const ErrorDataStateWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + BootstrapIcons.exclamation_circle, + color: Colors.grey.shade400, + ), + SizedBox(height: 8.h), + Text( + 'Terjadi Kesalahan', + style: AppTheme.labelSmall, + ), + ], + ), + ); + } +} diff --git a/agrilink_vocpro/lib/features/home/widgets/graphic_error_widget.dart b/agrilink_vocpro/lib/core/widgets/no_data_state_widget.dart similarity index 59% rename from agrilink_vocpro/lib/features/home/widgets/graphic_error_widget.dart rename to agrilink_vocpro/lib/core/widgets/no_data_state_widget.dart index 9654ce3..33d66aa 100644 --- a/agrilink_vocpro/lib/features/home/widgets/graphic_error_widget.dart +++ b/agrilink_vocpro/lib/core/widgets/no_data_state_widget.dart @@ -3,10 +3,10 @@ import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -class GraphicErrorWidget extends StatelessWidget { - const GraphicErrorWidget({super.key, required this.message}); - - final String message; +class NoDataStateWidget extends StatelessWidget { + const NoDataStateWidget({ + super.key, + }); @override Widget build(BuildContext context) { @@ -14,9 +14,15 @@ class GraphicErrorWidget extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(BootstrapIcons.exclamation_circle, color: Colors.grey.shade400), + Icon( + BootstrapIcons.database_fill_x, + color: Colors.grey.shade400, + ), SizedBox(height: 8.h), - Text(message, style: AppTheme.labelSmall), + Text( + 'Tidak Ada Data', + style: AppTheme.labelSmall, + ), ], ), ); diff --git a/agrilink_vocpro/lib/features/auth/provider/auth_provider.dart b/agrilink_vocpro/lib/features/auth/provider/auth_provider.dart index 0126368..749f0ff 100644 --- a/agrilink_vocpro/lib/features/auth/provider/auth_provider.dart +++ b/agrilink_vocpro/lib/features/auth/provider/auth_provider.dart @@ -1,11 +1,11 @@ -import 'dart:convert'; +// import 'dart:convert'; import 'package:agrilink_vocpro/core/state/result_state.dart'; import 'package:agrilink_vocpro/domain/service/app_service.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:googleapis_auth/auth_io.dart'; -import 'package:http/http.dart' as http; +// import 'package:flutter/services.dart'; +// import 'package:googleapis_auth/auth_io.dart'; +// import 'package:http/http.dart' as http; class AuthProvider extends ChangeNotifier { TextEditingController emailController = TextEditingController(); @@ -80,30 +80,30 @@ class AuthProvider extends ChangeNotifier { return true; } - Future getAccessToken() async { - try { - final serviceAccountJson = await rootBundle.loadString( - 'assets/json/agrilink-vocpro-b37f9-firebase-adminsdk-a4f6g-e6565344e3.json', - ); + // Future getAccessToken() async { + // try { + // final serviceAccountJson = await rootBundle.loadString( + // 'assets/json/agrilink-vocpro-b37f9-firebase-adminsdk-a4f6g-e6565344e3.json', + // ); - final accountCredentials = ServiceAccountCredentials.fromJson( - json.decode(serviceAccountJson), - ); + // final accountCredentials = ServiceAccountCredentials.fromJson( + // json.decode(serviceAccountJson), + // ); - const scope = ['https://www.googleapis.com/auth/firebase.messaging']; + // const scope = ['https://www.googleapis.com/auth/firebase.messaging']; - final client = http.Client(); + // final client = http.Client(); - try { - final accessCredential = await obtainAccessCredentialsViaServiceAccount( - accountCredentials, scope, client); - final accessToken = accessCredential.accessToken.data; - print('Access Token: $accessToken'); - } catch (e) { - print('Error: $e'); - } - } catch (e) { - print('Error 2: $e'); - } - } + // try { + // final accessCredential = await obtainAccessCredentialsViaServiceAccount( + // accountCredentials, scope, client); + // final accessToken = accessCredential.accessToken.data; + // print('Access Token: $accessToken'); + // } catch (e) { + // print('Error: $e'); + // } + // } catch (e) { + // print('Error 2: $e'); + // } + // } } diff --git a/agrilink_vocpro/lib/features/home/detail_pages/conductivity/view/conductivity_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/conductivity/view/conductivity_screen.dart index fe76f07..3be4dbf 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/conductivity/view/conductivity_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/conductivity/view/conductivity_screen.dart @@ -1,7 +1,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/conductivity/provider/conductivity_provider.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -146,9 +147,9 @@ class ConductivityScreen extends StatelessWidget { maxValue: 1, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/nitrogen/view/nitrogen_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/nitrogen/view/nitrogen_screen.dart index aab46d2..2038526 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/nitrogen/view/nitrogen_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/nitrogen/view/nitrogen_screen.dart @@ -1,7 +1,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/nitrogen/provider/nitrogen_provider.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -146,9 +147,9 @@ class NitrogenScreen extends StatelessWidget { maxValue: 1, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/ph/view/ph_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/ph/view/ph_screen.dart index 5992eed..471e0e6 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/ph/view/ph_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/ph/view/ph_screen.dart @@ -1,8 +1,9 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/ph/provider/ph_provider.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/ph/widget/ph_bar_pointer.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -137,9 +138,9 @@ class PhScreen extends StatelessWidget { maxValue: 14, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/phosphorus/view/phosphorus_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/phosphorus/view/phosphorus_screen.dart index 9e1c304..fadbb7f 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/phosphorus/view/phosphorus_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/phosphorus/view/phosphorus_screen.dart @@ -1,7 +1,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/phosphorus/provider/phosporus_provider.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -146,9 +147,9 @@ class PhosphorusScreen extends StatelessWidget { maxValue: 10, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/potassium/view/potassium_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/potassium/view/potassium_screen.dart index f9a0f2c..e6f3ecd 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/potassium/view/potassium_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/potassium/view/potassium_screen.dart @@ -1,7 +1,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/potassium/provider/potassium_provider.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -146,9 +147,9 @@ class PotassiumScreen extends StatelessWidget { maxValue: 1, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/soil_moisture/view/soil_moisture_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/soil_moisture/view/soil_moisture_screen.dart index 451b1f6..9a45447 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/soil_moisture/view/soil_moisture_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/soil_moisture/view/soil_moisture_screen.dart @@ -1,7 +1,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/soil_moisture/provider/soil_moisture_provider.dart'; -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -176,9 +177,9 @@ class SoilMoistureScreen extends StatelessWidget { maxValue: 1, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/soil_temperature/view/soil_temperature_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/soil_temperature/view/soil_temperature_screen.dart index 02ee21b..6c6284c 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/soil_temperature/view/soil_temperature_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/soil_temperature/view/soil_temperature_screen.dart @@ -1,4 +1,5 @@ -import 'package:agrilink_vocpro/features/home/widgets/graphic_error_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:flutter/material.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; import 'package:flutter/cupertino.dart'; @@ -226,9 +227,9 @@ class SoilTemperatureScreen extends StatelessWidget { maxValue: 70, ); case ResultState.error: - return const GraphicErrorWidget(message: 'Terjadi Kesalahan'); + return const ErrorDataStateWidget(); case ResultState.noData: - return const GraphicErrorWidget(message: 'Tidak Ada Data'); + return const NoDataStateWidget(); case ResultState.initial: default: return const SizedBox.shrink(); diff --git a/agrilink_vocpro/lib/features/home/detail_pages/temperature/view/temperature_screen.dart b/agrilink_vocpro/lib/features/home/detail_pages/temperature/view/temperature_screen.dart index df4ce7c..a5f1968 100644 --- a/agrilink_vocpro/lib/features/home/detail_pages/temperature/view/temperature_screen.dart +++ b/agrilink_vocpro/lib/features/home/detail_pages/temperature/view/temperature_screen.dart @@ -1,5 +1,7 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/core/widgets/error_data_state_widget.dart'; +import 'package:agrilink_vocpro/core/widgets/no_data_state_widget.dart'; import 'package:agrilink_vocpro/features/home/detail_pages/temperature/provider/temp_provider.dart'; import 'package:agrilink_vocpro/features/home/widgets/graphic_widget.dart'; import 'package:bootstrap_icons/bootstrap_icons.dart'; @@ -30,7 +32,7 @@ class TemperatureScreen extends StatelessWidget { padding: EdgeInsets.only(right: 16), child: Icon( BootstrapIcons.thermometer_half, - color: Colors.red, + color: Colors.orange, ), ) ], @@ -228,39 +230,9 @@ class TemperatureScreen extends StatelessWidget { 0), ); case ResultState.error: - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - BootstrapIcons.exclamation_circle, - color: Colors.grey.shade400, - ), - SizedBox(height: 8.h), - Text( - 'Terjadi Kesalahan', - style: AppTheme.labelSmall, - ), - ], - ), - ); + return ErrorDataStateWidget(); case ResultState.noData: - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - BootstrapIcons.database_fill_x, - color: Colors.grey.shade400, - ), - SizedBox(height: 8.h), - Text( - 'Tidak Ada Data', - style: AppTheme.labelSmall, - ), - ], - ), - ); + return NoDataStateWidget(); case ResultState.initial: return const SizedBox.shrink(); default: diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart index a95ecb1..f4aa3b0 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_dht.dart @@ -54,7 +54,7 @@ class ListDataFromCensorDht extends StatelessWidget { unit: '%', icon: BootstrapIcons.droplet_half, color: Colors.white, - censorIdentifier: 'NPK 1', + censorIdentifier: 'DHT', onTap: () async { await context .push('${AppRoute.humidity}/${provider.dhtHumidity}'); @@ -67,6 +67,7 @@ class ListDataFromCensorDht extends StatelessWidget { unit: '°C', icon: BootstrapIcons.thermometer_half, color: Colors.white, + censorIdentifier: 'DHT', onTap: () async { await context.push( '${AppRoute.temperature}/${provider.dhtTemperature}'); @@ -79,6 +80,7 @@ class ListDataFromCensorDht extends StatelessWidget { unit: 'lux', icon: BootstrapIcons.sun, color: Colors.white, + censorIdentifier: 'DHT', onTap: () async { await context .push('${AppRoute.light}/${provider.dhtLuminosity}'); diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart index c715e83..1e24e6d 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk1.dart @@ -55,6 +55,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget { textColor: Colors.white, color: AppColor.secondary, iconColor: Colors.white, + censorIdentifier: censorIdentifier, onTap: () async { await context.push( '${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}'); @@ -69,6 +70,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget { textColor: Colors.white, color: AppColor.secondary, iconColor: Colors.white, + censorIdentifier: censorIdentifier, onTap: () async { await context.push( '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); @@ -83,6 +85,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget { textColor: Colors.white, color: AppColor.secondary, iconColor: Colors.white, + censorIdentifier: censorIdentifier, onTap: () async { await context.push( '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}'); diff --git a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart index 5905e9e..326c436 100644 --- a/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart +++ b/agrilink_vocpro/lib/features/home/widgets/list_data_from_censor_npk2.dart @@ -18,7 +18,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget { @override Widget build(BuildContext context) { - const String censorIdentifier = 'NPK 1'; + const String censorIdentifier = 'NPK 2'; return Consumer(builder: (context, provider, child) { switch (provider.dataState) { case ResultState.loading: @@ -54,6 +54,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget { icon: CupertinoIcons.eyedropper, textColor: Colors.white, color: AppColor.secondary, + censorIdentifier: censorIdentifier, iconColor: Colors.white, onTap: () async { await context.push( @@ -69,6 +70,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget { textColor: Colors.white, color: AppColor.secondary, iconColor: Colors.white, + censorIdentifier: censorIdentifier, onTap: () async { await context.push( '${AppRoute.phosphorus}/${provider.npk1SoilPhosphorus}/${provider.npk2SoilPhosphorus}'); @@ -83,6 +85,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget { textColor: Colors.white, color: AppColor.secondary, iconColor: Colors.white, + censorIdentifier: censorIdentifier, onTap: () async { await context.push( '${AppRoute.potassium}/${provider.npk1SoilPotassium}/${provider.npk2SoilPotassium}');