Compare commits
10 Commits
0e2b194e20
...
39989fa8a0
| Author | SHA1 | Date | |
|---|---|---|---|
| 39989fa8a0 | |||
| a7e5572912 | |||
| f1f422d8f6 | |||
| 599f6b6e73 | |||
| 6d6440732d | |||
| ad15e58f33 | |||
| 305443f291 | |||
| 6350a22b00 | |||
| ff74888996 | |||
| ecfd6e7145 |
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive"
|
||||||
|
}
|
||||||
68
README.md
68
README.md
|
|
@ -35,11 +35,11 @@ This project uses several packages to support various functionalities. Below is
|
||||||
## Installation Guide
|
## Installation Guide
|
||||||
1. Clone the repository:
|
1. Clone the repository:
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/username/smart-farming.git
|
git clone https://gitlab.com/profile-image/kedaireka/smartfarming/mobile-smartfarming.git
|
||||||
```
|
```
|
||||||
2. Navigate to the project directory:
|
2. Navigate to the flutter project directory:
|
||||||
```bash
|
```bash
|
||||||
cd smart-farming
|
cd agrilink_vocpro
|
||||||
```
|
```
|
||||||
3. Install dependencies:
|
3. Install dependencies:
|
||||||
```bash
|
```bash
|
||||||
|
|
@ -48,10 +48,22 @@ This project uses several packages to support various functionalities. Below is
|
||||||
if it does't work try:
|
if it does't work try:
|
||||||
```bash
|
```bash
|
||||||
flutter outdated
|
flutter outdated
|
||||||
//follow with
|
// follow with
|
||||||
flutter pub upgrade --major-versions
|
flutter pub upgrade --major-versions
|
||||||
```
|
```
|
||||||
or check your latest dart version make sure it compatible with this project
|
or check your latest dart version make sure it compatible with this project
|
||||||
|
|
||||||
|
project tool version
|
||||||
|
|
||||||
|
```
|
||||||
|
• Flutter version 3.27.0-1.0.pre.685
|
||||||
|
• Upstream repository https://github.com/flutter/flutter.git
|
||||||
|
• Framework revision 227f6a04f7, 2024-12-03 13:21:59 +0100
|
||||||
|
• Engine revision f9d4f744e0
|
||||||
|
• Dart version 3.7.0 (build 3.7.0-207.0.dev)
|
||||||
|
• DevTools version 2.41.0
|
||||||
|
```
|
||||||
|
|
||||||
4. Run the project:
|
4. Run the project:
|
||||||
```bash
|
```bash
|
||||||
flutter run
|
flutter run
|
||||||
|
|
@ -63,26 +75,48 @@ Berikan deskripsi singkat tentang struktur folder dan file penting di dalam proy
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
- `lib/`: Contains the Flutter app source code.
|
- `lib/`: Contains the Flutter app source code.
|
||||||
- `core/`: Contains all constant vaalue and data needed for the project.
|
- `core/`: Contains all constant value and data needed for the project.
|
||||||
- `data/`: Conatains model and data response
|
- `data/`: Contains model and data response
|
||||||
- `domain/`: logic and service of the application
|
- `domain/`: logic and service of the application
|
||||||
- `feature/`: Contains every feature in the app
|
- `feature/`: Contains every feature in the app
|
||||||
- `provider/`
|
- `provider/`: Contains a function to integrate with domain layer
|
||||||
- `view`
|
- `view` : contains the main screen UI code
|
||||||
- `widget`
|
- `widget` : conatins the widget UI code
|
||||||
- `pubspec.yaml`: Project dependencies and configurations.
|
- `pubspec.yaml`: Project dependencies and configurations.
|
||||||
|
|
||||||
|
|
||||||
## Progress Report
|
## Progress Report
|
||||||
|
|
||||||
| Date | Type | Description |
|
| Date | Type | Description |
|
||||||
|------------|-------|-----------------------------------------------------------------------------------------------------|
|
|------------|-------|------------------------------------------------------------------------------------------------------|
|
||||||
| 2024-10-09 | feat | Completed the integration of MQTT for sensor data and IoT device control. |
|
| 2024-09-09 | feat | Created basic app structure for Agrilink Vocpro. |
|
||||||
| 2024-10-02 | fix | Implemented auto-reconnect for MQTT on app open/close. |
|
| 2024-09-10 | feat | Sliced splash screen and login screen. |
|
||||||
| 2024-09-30 | feat | Added UI for displaying soil pH level with a linear bar. |
|
| 2024-09-11 | feat | Sliced home page for Agrilink Vocpro. |
|
||||||
| 2024-09-27 | feat | Finalized group display for 'Doses' in ExpansionTile for medicine dosage recommendations. |
|
| 2024-09-12 | fix | Revamped home page for Agrilink Vocpro. |
|
||||||
| 2024-09-24 | feat | Completed sorting dialog functionality with single sorter selection capability. |
|
| 2024-09-13 | feat | Created and animated graph or flowchart with `fl_chart`. |
|
||||||
| 2024-09-20 | feat | Implemented patient data creation form with validation and state management using dialogs. |
|
| 2024-09-16 | learn | Learned about implementing graphics UI in Flutter. |
|
||||||
|
| 2024-09-17 | feat | Created bottom nav bar and revamped data display widgets in Agrilink app. |
|
||||||
|
| 2024-09-18 | feat | Added detail screen for Potassium, Nitrogen, and Phosphorus. |
|
||||||
|
| 2024-09-19 | feat | Created custom screen for soil pH data. |
|
||||||
|
| 2024-09-20 | feat | Handled POST requests with dialog. |
|
||||||
|
| 2024-09-23 | feat | Added basic app routes for Agrilink app. |
|
||||||
|
| 2024-09-24 | fix | Revamped home page again in Agrilink app. |
|
||||||
|
| 2024-09-25 | feat | Created detail screen for temperature and light intensity features. |
|
||||||
|
| 2024-09-26 | feat | Sliced setting screen. |
|
||||||
|
| 2024-09-27 | feat | Implemented infinite scroll with `infinite_scroll_pagination` package. |
|
||||||
|
| 2024-10-01 | meet | Conducted progress report with Pak Vipkas. |
|
||||||
|
| 2024-10-02 | feat | Connected Flutter with MQTT broker using `mqtt_client` dependency. |
|
||||||
|
| 2024-10-03 | feat | Created request to publish message to MQTT broker. |
|
||||||
|
| 2024-10-04 | test | Tested subscribe and publish message to real device. |
|
||||||
|
| 2024-10-07 | feat | Added error and no data screens in Agrilink Vocpro. |
|
||||||
|
| 2024-10-08 | fix | Revamped graph UI in Agrilink app; integrated relay control with backend. |
|
||||||
|
| 2024-10-09 | doc | Created project documentation in `README.md` on GitLab. |
|
||||||
|
| 2024-10-10 | fix | Revamped detail screen for each DHT data sensor. |
|
||||||
|
| 2024-10-11 | fix | Revamped detail screen for each NPK data sensor. |
|
||||||
|
| 2024-10-14 | feat | Integrated REST API for fetching current data. |
|
||||||
|
| 2024-10-15 | feat | Integrated REST API for fetching historical data and displaying it in a graph. |
|
||||||
|
| 2024-10-16 | feat | Integrated REST API for controlling relay. |
|
||||||
|
| 2024-11-06 | feat | Tidy up the code |
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ plugins {
|
||||||
android {
|
android {
|
||||||
namespace = "com.pis.agrilink_vocpro"
|
namespace = "com.pis.agrilink_vocpro"
|
||||||
compileSdk = flutter.compileSdkVersion
|
compileSdk = flutter.compileSdkVersion
|
||||||
ndkVersion = flutter.ndkVersion
|
ndkVersion = "27.0.12077973"
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
|
@ -33,11 +33,19 @@ android {
|
||||||
versionName = flutter.versionName
|
versionName = flutter.versionName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
keyAlias 'agrilink-upload'
|
||||||
|
keyPassword '100403'
|
||||||
|
storeFile file('D:/Code/real_project/flutter/mobile-smartfarming/upload-keystore.jks')
|
||||||
|
storePassword '100403'
|
||||||
|
}
|
||||||
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
// TODO: Add your own signing config for the release build.
|
signingConfig signingConfigs.release
|
||||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
minifyEnabled true // You can set to true for release builds
|
||||||
signingConfig = signingConfigs.debug
|
shrinkResources true // Set to true if minify is true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<application
|
<application
|
||||||
android:label="agrilink_vocpro"
|
android:label="Agrilink Vocpro"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:enableOnBackInvokedCallback="true">
|
android:enableOnBackInvokedCallback="true">
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,11 @@ pluginManagement {
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version "7.3.0" apply false
|
id "com.android.application" version "8.7.0" apply false
|
||||||
// START: FlutterFire Configuration
|
// START: FlutterFire Configuration
|
||||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||||
// END: FlutterFire Configuration
|
// END: FlutterFire Configuration
|
||||||
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
|
id "org.jetbrains.kotlin.android" version "2.0.20" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
include ":app"
|
include ":app"
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 7.2 KiB |
BIN
agrilink_vocpro/assets/images/water_pump.png
Normal file
BIN
agrilink_vocpro/assets/images/water_pump.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.5 KiB |
|
|
@ -2,7 +2,7 @@ class AppConstant {
|
||||||
static const String appName = 'Kebun Pintar';
|
static const String appName = 'Kebun Pintar';
|
||||||
static const String appVersion = '1.0.0';
|
static const String appVersion = '1.0.0';
|
||||||
|
|
||||||
static const String baseUrl = 'http://54.196.58.97:3333';
|
static const String baseUrl = 'http://192.168.60.108';
|
||||||
|
|
||||||
static const String mqttServer = 'armadillo.rmq.cloudamqp.com';
|
static const String mqttServer = 'armadillo.rmq.cloudamqp.com';
|
||||||
static const String mqttUsername = 'obyskxhx:obyskxhx';
|
static const String mqttUsername = 'obyskxhx:obyskxhx';
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,32 @@ String getGreeting(String time) {
|
||||||
return 'Selamat Malam';
|
return 'Selamat Malam';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String timeAgo(String? dateString) {
|
||||||
|
if (dateString == null) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
DateTime date = DateTime.parse(dateString);
|
||||||
|
DateTime now = DateTime.now();
|
||||||
|
|
||||||
|
Duration difference = now.difference(date);
|
||||||
|
|
||||||
|
if (difference.inMinutes < 1) {
|
||||||
|
return "Baru saja";
|
||||||
|
} else if (difference.inMinutes < 60) {
|
||||||
|
return "${difference.inMinutes} menit yang lalu";
|
||||||
|
} else if (difference.inHours < 24) {
|
||||||
|
return "${difference.inHours} jam yang lalu";
|
||||||
|
} else if (difference.inDays < 7) {
|
||||||
|
return "${difference.inDays} hari yang lalu";
|
||||||
|
} else if (difference.inDays < 30) {
|
||||||
|
int weeks = (difference.inDays / 7).floor();
|
||||||
|
return "$weeks minggu yang lalu";
|
||||||
|
} else if (difference.inDays < 365) {
|
||||||
|
int months = (difference.inDays / 30).floor();
|
||||||
|
return "$months bulan yang lalu";
|
||||||
|
} else {
|
||||||
|
int years = (difference.inDays / 365).floor();
|
||||||
|
return "$years tahun yang lalu";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
class RelayResponse {
|
class RelayResponse {
|
||||||
bool? success;
|
bool? success;
|
||||||
List<Data>? data;
|
List<Relay>? data;
|
||||||
|
|
||||||
RelayResponse({this.success, this.data});
|
RelayResponse({this.success, this.data});
|
||||||
|
|
||||||
RelayResponse.fromJson(Map<String, dynamic> json) {
|
RelayResponse.fromJson(Map<String, dynamic> json) {
|
||||||
success = json['success'];
|
success = json['success'];
|
||||||
if (json['data'] != null) {
|
if (json['data'] != null) {
|
||||||
data = <Data>[];
|
data = <Relay>[];
|
||||||
json['data'].forEach((v) {
|
json['data'].forEach((v) {
|
||||||
data!.add(Data.fromJson(v));
|
data!.add(Relay.fromJson(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -24,7 +24,7 @@ class RelayResponse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Data {
|
class Relay {
|
||||||
int? id;
|
int? id;
|
||||||
int? number;
|
int? number;
|
||||||
String? enabledAt;
|
String? enabledAt;
|
||||||
|
|
@ -32,7 +32,7 @@ class Data {
|
||||||
bool? currentStatus;
|
bool? currentStatus;
|
||||||
String? createdAt;
|
String? createdAt;
|
||||||
|
|
||||||
Data(
|
Relay(
|
||||||
{this.id,
|
{this.id,
|
||||||
this.number,
|
this.number,
|
||||||
this.enabledAt,
|
this.enabledAt,
|
||||||
|
|
@ -40,7 +40,7 @@ class Data {
|
||||||
this.currentStatus,
|
this.currentStatus,
|
||||||
this.createdAt});
|
this.createdAt});
|
||||||
|
|
||||||
Data.fromJson(Map<String, dynamic> json) {
|
Relay.fromJson(Map<String, dynamic> json) {
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
number = json['number'];
|
number = json['number'];
|
||||||
enabledAt = json['enabled_at'];
|
enabledAt = json['enabled_at'];
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:agrilink_vocpro/core/state/result_state.dart';
|
import 'package:agrilink_vocpro/core/state/result_state.dart';
|
||||||
|
import 'package:agrilink_vocpro/data/model/relay_response.dart';
|
||||||
import 'package:agrilink_vocpro/domain/service/app_service.dart';
|
import 'package:agrilink_vocpro/domain/service/app_service.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
|
@ -11,6 +12,18 @@ class ControlProvider extends ChangeNotifier {
|
||||||
bool _control_2 = false;
|
bool _control_2 = false;
|
||||||
bool get control_2 => _control_2;
|
bool get control_2 => _control_2;
|
||||||
|
|
||||||
|
bool _control_3 = false;
|
||||||
|
bool get control_3 => _control_3;
|
||||||
|
|
||||||
|
Relay _relay1 = Relay();
|
||||||
|
Relay get relay1 => _relay1;
|
||||||
|
|
||||||
|
Relay _relay2 = Relay();
|
||||||
|
Relay get relay2 => _relay2;
|
||||||
|
|
||||||
|
Relay _relay3 = Relay();
|
||||||
|
Relay get relay3 => _relay3;
|
||||||
|
|
||||||
ControlProvider() {
|
ControlProvider() {
|
||||||
getRelayStatus();
|
getRelayStatus();
|
||||||
}
|
}
|
||||||
|
|
@ -28,10 +41,16 @@ class ControlProvider extends ChangeNotifier {
|
||||||
if (result.success == true) {
|
if (result.success == true) {
|
||||||
for (var element in result.data!) {
|
for (var element in result.data!) {
|
||||||
if (element.number == 1) {
|
if (element.number == 1) {
|
||||||
switchControl1(element.currentStatus ?? false);
|
_relay1 = element;
|
||||||
|
switchControl(element.currentStatus ?? false, relayNumber: 1);
|
||||||
}
|
}
|
||||||
if (element.number == 2) {
|
if (element.number == 2) {
|
||||||
switchControl2(element.currentStatus ?? false);
|
_relay2 = element;
|
||||||
|
switchControl(element.currentStatus ?? false, relayNumber: 2);
|
||||||
|
}
|
||||||
|
if (element.number == 3) {
|
||||||
|
_relay3 = element;
|
||||||
|
switchControl(element.currentStatus ?? false, relayNumber: 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
relayState = ResultState.hasData;
|
relayState = ResultState.hasData;
|
||||||
|
|
@ -53,15 +72,13 @@ class ControlProvider extends ChangeNotifier {
|
||||||
relayState = ResultState.loading;
|
relayState = ResultState.loading;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
final int stateConverted;
|
final int stateConverted = state ? 1 : 0;
|
||||||
if (state == true) {
|
|
||||||
stateConverted = 1;
|
|
||||||
} else {
|
|
||||||
stateConverted = 0;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
final result = await _appService.switchRelay(
|
final result = await _appService.switchRelay(
|
||||||
relayNumber: relayNumber, state: stateConverted);
|
relayNumber: relayNumber,
|
||||||
|
state: stateConverted,
|
||||||
|
);
|
||||||
|
|
||||||
if (result.success == true) {
|
if (result.success == true) {
|
||||||
relayState = ResultState.hasData;
|
relayState = ResultState.hasData;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
@ -82,13 +99,20 @@ class ControlProvider extends ChangeNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void switchControl1(bool value) {
|
void switchControl(bool value, {required int relayNumber}) {
|
||||||
_control_1 = value;
|
switch (relayNumber) {
|
||||||
notifyListeners();
|
case 1:
|
||||||
}
|
_control_1 = value;
|
||||||
|
break;
|
||||||
void switchControl2(bool value) {
|
case 2:
|
||||||
_control_2 = value;
|
_control_2 = value;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
_control_3 = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ import 'package:agrilink_vocpro/core/constant/app_theme.dart';
|
||||||
import 'package:agrilink_vocpro/core/state/result_state.dart';
|
import 'package:agrilink_vocpro/core/state/result_state.dart';
|
||||||
import 'package:agrilink_vocpro/features/control/provider/control_provider.dart';
|
import 'package:agrilink_vocpro/features/control/provider/control_provider.dart';
|
||||||
import 'package:agrilink_vocpro/features/control/widgets/control_button_widget.dart';
|
import 'package:agrilink_vocpro/features/control/widgets/control_button_widget.dart';
|
||||||
|
import 'package:agrilink_vocpro/features/control/widgets/pump_status_widget.dart';
|
||||||
|
import 'package:agrilink_vocpro/features/control/widgets/relay_status_history_widget.dart';
|
||||||
import 'package:bootstrap_icons/bootstrap_icons.dart';
|
import 'package:bootstrap_icons/bootstrap_icons.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
@ -34,7 +36,7 @@ class ControlScreen extends StatelessWidget {
|
||||||
return const StatusBarWidget(
|
return const StatusBarWidget(
|
||||||
text: 'Memuat...',
|
text: 'Memuat...',
|
||||||
icon: BootstrapIcons.cloud,
|
icon: BootstrapIcons.cloud,
|
||||||
color: Colors.cyan,
|
color: Colors.grey,
|
||||||
isLoading: true,
|
isLoading: true,
|
||||||
);
|
);
|
||||||
case ResultState.hasData:
|
case ResultState.hasData:
|
||||||
|
|
@ -59,6 +61,12 @@ class ControlScreen extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
PumpStatusWidget(
|
||||||
|
title: 'Pompa Air',
|
||||||
|
subtitle: 'Relay 3',
|
||||||
|
isActive: provider.control_3,
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
SizedBox(height: 16.h),
|
SizedBox(height: 16.h),
|
||||||
GridView(
|
GridView(
|
||||||
padding: EdgeInsets.all(16.r),
|
padding: EdgeInsets.all(16.r),
|
||||||
|
|
@ -76,12 +84,11 @@ class ControlScreen extends StatelessWidget {
|
||||||
subtitle: 'Relay 1',
|
subtitle: 'Relay 1',
|
||||||
isActive: provider.control_1,
|
isActive: provider.control_1,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
final result = provider.control_1 != true
|
await _changeRelayStateAction(
|
||||||
? await provider.switchRelay(1, true)
|
provider: provider,
|
||||||
: await provider.switchRelay(1, false);
|
relayOn: 1,
|
||||||
result == true
|
relayOff: 2,
|
||||||
? provider.switchControl1(!provider.control_1)
|
);
|
||||||
: provider.switchControl1(provider.control_1);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ControlButtonWidget(
|
ControlButtonWidget(
|
||||||
|
|
@ -89,22 +96,102 @@ class ControlScreen extends StatelessWidget {
|
||||||
subtitle: 'Relay 2',
|
subtitle: 'Relay 2',
|
||||||
isActive: provider.control_2,
|
isActive: provider.control_2,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
final result = provider.control_2 != true
|
await _changeRelayStateAction(
|
||||||
? await provider.switchRelay(2, true)
|
provider: provider,
|
||||||
: await provider.switchRelay(2, false);
|
relayOn: 2,
|
||||||
result == true
|
relayOff: 1,
|
||||||
? provider.switchControl2(!provider.control_2)
|
);
|
||||||
: provider.switchControl2(provider.control_2);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(16.r, 0, 16.r, 16.h),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
BootstrapIcons.clock,
|
||||||
|
size: 20.r,
|
||||||
|
),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
|
Text(
|
||||||
|
'Terakhir Diperbarui',
|
||||||
|
style: AppTheme.labelMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Consumer<ControlProvider>(builder: (context, provider, child) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
RelayStatusHistoryWidget(
|
||||||
|
name: 'Katup Nutrisi',
|
||||||
|
imageUrl: 'assets/images/valve.png',
|
||||||
|
enabledAt: provider.relay1.enabledAt,
|
||||||
|
disabledAt: provider.relay1.disabledAt,
|
||||||
|
),
|
||||||
|
RelayStatusHistoryWidget(
|
||||||
|
name: 'Katup Air',
|
||||||
|
imageUrl: 'assets/images/valve.png',
|
||||||
|
enabledAt: provider.relay2.enabledAt,
|
||||||
|
disabledAt: provider.relay2.disabledAt,
|
||||||
|
),
|
||||||
|
RelayStatusHistoryWidget(
|
||||||
|
name: 'Pompa Air',
|
||||||
|
imageUrl: 'assets/images/water_pump.png',
|
||||||
|
enabledAt: provider.relay3.enabledAt,
|
||||||
|
disabledAt: provider.relay3.disabledAt,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _changeRelayStateAction({
|
||||||
|
required ControlProvider provider,
|
||||||
|
required int relayOn,
|
||||||
|
required int relayOff,
|
||||||
|
}) async {
|
||||||
|
if (relayOn == 1) {
|
||||||
|
// Aktifkan relay 1 dan relay 3, matikan relay 2
|
||||||
|
if (provider.control_1 == false) {
|
||||||
|
await provider.switchRelay(relayOff, false); // Matikan relay 2
|
||||||
|
await provider.switchRelay(3, true); // Aktifkan relay 3
|
||||||
|
await provider.switchRelay(relayOn, true); // Aktifkan relay 1
|
||||||
|
provider.switchControl(true, relayNumber: 1);
|
||||||
|
provider.switchControl(true, relayNumber: 3);
|
||||||
|
provider.switchControl(false, relayNumber: 2);
|
||||||
|
} else {
|
||||||
|
// Matikan semua relay jika relay 1 dimatikan
|
||||||
|
await provider.switchRelay(3, false);
|
||||||
|
await provider.switchRelay(relayOn, false);
|
||||||
|
provider.switchControl(false, relayNumber: 1);
|
||||||
|
provider.switchControl(false, relayNumber: 3);
|
||||||
|
}
|
||||||
|
} else if (relayOn == 2) {
|
||||||
|
// Aktifkan relay 2 dan relay 3, matikan relay 1
|
||||||
|
if (provider.control_2 == false) {
|
||||||
|
await provider.switchRelay(relayOff, false); // Matikan relay 1
|
||||||
|
await provider.switchRelay(3, true); // Aktifkan relay 3
|
||||||
|
await provider.switchRelay(relayOn, true); // Aktifkan relay 2
|
||||||
|
provider.switchControl(true, relayNumber: 2);
|
||||||
|
provider.switchControl(true, relayNumber: 3);
|
||||||
|
provider.switchControl(false, relayNumber: 1);
|
||||||
|
} else {
|
||||||
|
// Matikan semua relay jika relay 2 dimatikan
|
||||||
|
await provider.switchRelay(3, false);
|
||||||
|
await provider.switchRelay(relayOn, false);
|
||||||
|
provider.switchControl(false, relayNumber: 2);
|
||||||
|
provider.switchControl(false, relayNumber: 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StatusBarWidget extends StatelessWidget {
|
class StatusBarWidget extends StatelessWidget {
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ class ControlButtonWidget extends StatelessWidget {
|
||||||
boxShadow: [
|
boxShadow: [
|
||||||
BoxShadow(
|
BoxShadow(
|
||||||
color: isActive
|
color: isActive
|
||||||
? AppColor.secondary.withOpacity(0.2)
|
? AppColor.secondary.withValues(alpha: 0.2)
|
||||||
: Colors.grey.withOpacity(0.2),
|
: Colors.grey.withValues(alpha: 0.2),
|
||||||
spreadRadius: 1.r,
|
spreadRadius: 1.r,
|
||||||
blurRadius: 16.r,
|
blurRadius: 16.r,
|
||||||
offset: Offset(0, 12.r),
|
offset: Offset(0, 12.r),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
import 'package:agrilink_vocpro/core/constant/app_color.dart';
|
||||||
|
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
|
||||||
|
import 'package:agrilink_vocpro/core/state/result_state.dart';
|
||||||
|
import 'package:agrilink_vocpro/features/control/provider/control_provider.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class PumpStatusWidget extends StatelessWidget {
|
||||||
|
const PumpStatusWidget({
|
||||||
|
super.key,
|
||||||
|
required this.title,
|
||||||
|
required this.subtitle,
|
||||||
|
required this.isActive,
|
||||||
|
required this.onTap,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String title;
|
||||||
|
final String subtitle;
|
||||||
|
final bool isActive;
|
||||||
|
final Function() onTap;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
height: 100.h,
|
||||||
|
padding: EdgeInsets.all(16.r),
|
||||||
|
margin: EdgeInsets.symmetric(horizontal: 16.r),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: isActive
|
||||||
|
? AppColor.secondary.withValues(alpha: 0.2)
|
||||||
|
: Colors.grey.withValues(alpha: 0.2),
|
||||||
|
spreadRadius: 1.r,
|
||||||
|
blurRadius: 16.r,
|
||||||
|
offset: Offset(0, 12.r),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(title, style: AppTheme.labelMedium),
|
||||||
|
Text(subtitle, style: AppTheme.labelSmall),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
Consumer<ControlProvider>(
|
||||||
|
builder: (context, provider, child) {
|
||||||
|
switch (provider.relayState) {
|
||||||
|
case ResultState.loading:
|
||||||
|
return Image.asset(
|
||||||
|
'assets/images/water_pump.png',
|
||||||
|
width: 80.r,
|
||||||
|
color: AppColor.textDisable,
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
return Image.asset(
|
||||||
|
'assets/images/water_pump.png',
|
||||||
|
width: 80.r,
|
||||||
|
color: isActive ? AppColor.secondary : AppColor.textDisable,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
|
||||||
|
import 'package:agrilink_vocpro/core/extension/extention.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../../core/constant/app_color.dart';
|
||||||
|
|
||||||
|
class RelayStatusHistoryWidget extends StatelessWidget {
|
||||||
|
const RelayStatusHistoryWidget({
|
||||||
|
super.key,
|
||||||
|
required this.disabledAt,
|
||||||
|
required this.enabledAt,
|
||||||
|
required this.name,
|
||||||
|
required this.imageUrl,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? disabledAt;
|
||||||
|
final String? enabledAt;
|
||||||
|
final String name;
|
||||||
|
final String imageUrl;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ListTile(
|
||||||
|
leading: CircleAvatar(
|
||||||
|
radius: 26.r,
|
||||||
|
backgroundColor: AppColor.ternary,
|
||||||
|
child: Image.asset(
|
||||||
|
imageUrl,
|
||||||
|
width: 24.r,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
name,
|
||||||
|
style: AppTheme.labelMedium,
|
||||||
|
),
|
||||||
|
subtitle: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
CircleAvatar(
|
||||||
|
backgroundColor: Colors.greenAccent,
|
||||||
|
radius: 4.r,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
' Aktif ${timeAgo(enabledAt)}',
|
||||||
|
style: AppTheme.labelSmall,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
CircleAvatar(
|
||||||
|
backgroundColor: Colors.grey.shade300,
|
||||||
|
radius: 4.r,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
' Nonaktif ${timeAgo(disabledAt)}',
|
||||||
|
style: AppTheme.labelSmall,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -144,14 +144,12 @@ class ConductivityScreen extends StatelessWidget {
|
||||||
? provider.dataFetchedNpk1[index].soilconductivity ?? 0
|
? provider.dataFetchedNpk1[index].soilconductivity ?? 0
|
||||||
: provider.dataFetchedNpk2[index].soilconductivity ?? 0,
|
: provider.dataFetchedNpk2[index].soilconductivity ?? 0,
|
||||||
),
|
),
|
||||||
maxValue: 1,
|
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return const ErrorDataStateWidget();
|
return const ErrorDataStateWidget();
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -152,10 +152,6 @@ class HumidityScreen extends StatelessWidget {
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
default:
|
|
||||||
return const Center(
|
|
||||||
child: Text('Default Error'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,7 @@ class LightScreen extends StatelessWidget {
|
||||||
provider.dataFetched[index].vicihumidity
|
provider.dataFetched[index].vicihumidity
|
||||||
?.toDouble() ??
|
?.toDouble() ??
|
||||||
0),
|
0),
|
||||||
|
maxValue: 500,
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return Center(
|
return Center(
|
||||||
|
|
@ -174,10 +175,6 @@ class LightScreen extends StatelessWidget {
|
||||||
);
|
);
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
default:
|
|
||||||
return const Center(
|
|
||||||
child: Text('Default Error'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ class NitrogenScreen extends StatelessWidget {
|
||||||
size: 64.r,
|
size: 64.r,
|
||||||
color: Colors.blue,
|
color: Colors.blue,
|
||||||
),
|
),
|
||||||
Text('$value ppm', style: AppTheme.headline1),
|
Text('$value mg/L', style: AppTheme.headline1),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -144,14 +144,13 @@ class NitrogenScreen extends StatelessWidget {
|
||||||
? provider.dataFetchedNpk1[index].soilnitrogen ?? 0
|
? provider.dataFetchedNpk1[index].soilnitrogen ?? 0
|
||||||
: provider.dataFetchedNpk2[index].soilnitrogen ?? 0,
|
: provider.dataFetchedNpk2[index].soilnitrogen ?? 0,
|
||||||
),
|
),
|
||||||
maxValue: 1,
|
maxValue: 10,
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return const ErrorDataStateWidget();
|
return const ErrorDataStateWidget();
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,6 @@ class PhScreen extends StatelessWidget {
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ class PhosphorusScreen extends StatelessWidget {
|
||||||
size: 64.r,
|
size: 64.r,
|
||||||
color: Colors.blue,
|
color: Colors.blue,
|
||||||
),
|
),
|
||||||
Text('$value ppm', style: AppTheme.headline1),
|
Text('$value mg/L', style: AppTheme.headline1),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -144,14 +144,13 @@ class PhosphorusScreen extends StatelessWidget {
|
||||||
? provider.dataFetchedNpk1[index].soilphosphorus ?? 0
|
? provider.dataFetchedNpk1[index].soilphosphorus ?? 0
|
||||||
: provider.dataFetchedNpk2[index].soilphosphorus ?? 0,
|
: provider.dataFetchedNpk2[index].soilphosphorus ?? 0,
|
||||||
),
|
),
|
||||||
maxValue: 10,
|
maxValue: 100,
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return const ErrorDataStateWidget();
|
return const ErrorDataStateWidget();
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ class PotassiumScreen extends StatelessWidget {
|
||||||
size: 64.r,
|
size: 64.r,
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
),
|
),
|
||||||
Text('$value ppm', style: AppTheme.headline1),
|
Text('$value mg/L', style: AppTheme.headline1),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -144,14 +144,13 @@ class PotassiumScreen extends StatelessWidget {
|
||||||
? provider.dataFetchedNpk1[index].soilpotassium ?? 0
|
? provider.dataFetchedNpk1[index].soilpotassium ?? 0
|
||||||
: provider.dataFetchedNpk2[index].soilpotassium ?? 0,
|
: provider.dataFetchedNpk2[index].soilpotassium ?? 0,
|
||||||
),
|
),
|
||||||
maxValue: 1,
|
maxValue: 100,
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return const ErrorDataStateWidget();
|
return const ErrorDataStateWidget();
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -173,14 +173,12 @@ class SoilMoistureScreen extends StatelessWidget {
|
||||||
? provider.dataFetchedNpk1[index].soilhumidity ?? 0
|
? provider.dataFetchedNpk1[index].soilhumidity ?? 0
|
||||||
: provider.dataFetchedNpk2[index].soilhumidity ?? 0,
|
: provider.dataFetchedNpk2[index].soilhumidity ?? 0,
|
||||||
),
|
),
|
||||||
maxValue: 1,
|
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return const ErrorDataStateWidget();
|
return const ErrorDataStateWidget();
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ class SoilTemperatureScreen extends StatelessWidget {
|
||||||
height: 100.h,
|
height: 100.h,
|
||||||
width: 100.w,
|
width: 100.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: color.withOpacity(0.1),
|
color: color.withValues(alpha: 0.1),
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
border: Border.all(color: color, width: 2),
|
border: Border.all(color: color, width: 2),
|
||||||
),
|
),
|
||||||
|
|
@ -230,7 +230,6 @@ class SoilTemperatureScreen extends StatelessWidget {
|
||||||
case ResultState.noData:
|
case ResultState.noData:
|
||||||
return const NoDataStateWidget();
|
return const NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ class TemperatureScreen extends StatelessWidget {
|
||||||
width: 100.w,
|
width: 100.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
color: Colors.blue.withOpacity(0.1),
|
color: Colors.blue.withValues(alpha: 0.1),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Colors.blue,
|
color: Colors.blue,
|
||||||
width: 2,
|
width: 2,
|
||||||
|
|
@ -143,7 +143,7 @@ class TemperatureScreen extends StatelessWidget {
|
||||||
height: 100.h,
|
height: 100.h,
|
||||||
width: 100.w,
|
width: 100.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.green.withOpacity(0.1),
|
color: Colors.green.withValues(alpha: 0.1),
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Colors.green,
|
color: Colors.green,
|
||||||
|
|
@ -169,7 +169,7 @@ class TemperatureScreen extends StatelessWidget {
|
||||||
height: 100.h,
|
height: 100.h,
|
||||||
width: 100.w,
|
width: 100.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.orange.withOpacity(0.1),
|
color: Colors.orange.withValues(alpha: 0.1),
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Colors.orange.shade800,
|
color: Colors.orange.shade800,
|
||||||
|
|
@ -228,6 +228,7 @@ class TemperatureScreen extends StatelessWidget {
|
||||||
provider.dataFetched[index].vicitemperature
|
provider.dataFetched[index].vicitemperature
|
||||||
?.toDouble() ??
|
?.toDouble() ??
|
||||||
0),
|
0),
|
||||||
|
maxValue: 60,
|
||||||
);
|
);
|
||||||
case ResultState.error:
|
case ResultState.error:
|
||||||
return ErrorDataStateWidget();
|
return ErrorDataStateWidget();
|
||||||
|
|
@ -235,10 +236,6 @@ class TemperatureScreen extends StatelessWidget {
|
||||||
return NoDataStateWidget();
|
return NoDataStateWidget();
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
default:
|
|
||||||
return const Center(
|
|
||||||
child: Text('Default Error'),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: DefaultTabController(
|
body: DefaultTabController(
|
||||||
|
initialIndex: 1,
|
||||||
length: 3,
|
length: 3,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ class DataDisplayerWidget extends StatelessWidget {
|
||||||
borderRadius: BorderRadius.circular(16.r), // Bentuk sudut yang bundar
|
borderRadius: BorderRadius.circular(16.r), // Bentuk sudut yang bundar
|
||||||
),
|
),
|
||||||
elevation: 20, // Efek bayangan
|
elevation: 20, // Efek bayangan
|
||||||
shadowColor: Colors.grey.withOpacity(0.2),
|
shadowColor: Colors.grey.withValues(alpha: 0.2),
|
||||||
),
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
|
@ -52,7 +52,7 @@ class DataDisplayerWidget extends StatelessWidget {
|
||||||
child: Text(
|
child: Text(
|
||||||
censorIdentifier ?? '',
|
censorIdentifier ?? '',
|
||||||
style: AppTheme.labelSmall
|
style: AppTheme.labelSmall
|
||||||
.copyWith(color: textColor.withOpacity(0.5)),
|
.copyWith(color: textColor.withValues(alpha: 0.5)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Icon(icon, color: iconColor, size: 32.r),
|
Icon(icon, color: iconColor, size: 32.r),
|
||||||
|
|
@ -67,7 +67,7 @@ class DataDisplayerWidget extends StatelessWidget {
|
||||||
Text(
|
Text(
|
||||||
subtitle,
|
subtitle,
|
||||||
style: AppTheme.labelSmall
|
style: AppTheme.labelSmall
|
||||||
.copyWith(color: textColor.withOpacity(0.5)),
|
.copyWith(color: textColor.withValues(alpha: 0.5)),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ class GarphicWidget extends StatelessWidget {
|
||||||
show: true,
|
show: true,
|
||||||
gradient: LinearGradient(
|
gradient: LinearGradient(
|
||||||
colors: gradientColors
|
colors: gradientColors
|
||||||
.map((color) => color.withOpacity(0.3))
|
.map((color) => color.withValues(alpha: 0.3))
|
||||||
.toList()),
|
.toList()),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -102,8 +102,6 @@ class ListDataFromCensorDht extends StatelessWidget {
|
||||||
));
|
));
|
||||||
case ResultState.initial:
|
case ResultState.initial:
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
default:
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class ListDataFromCensorNpk1 extends StatelessWidget {
|
||||||
censorIdentifier: censorIdentifier,
|
censorIdentifier: censorIdentifier,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await context.push(
|
await context.push(
|
||||||
'${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}');
|
'${AppRoute.nitrogen}/${provider.npk1SoilNitrogen}/${provider.npk2SoilNitrogen}');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
DataDisplayerWidget(
|
DataDisplayerWidget(
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class ListDataFromCensorNpk2 extends StatelessWidget {
|
||||||
iconColor: Colors.white,
|
iconColor: Colors.white,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
await context.push(
|
await context.push(
|
||||||
'${AppRoute.nitrogen}/${provider.npk2SoilNitrogen}/${provider.npk1SoilNitrogen}');
|
'${AppRoute.nitrogen}/${provider.npk1SoilNitrogen}/${provider.npk2SoilNitrogen}');
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
DataDisplayerWidget(
|
DataDisplayerWidget(
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class _SplashScreenState extends State<SplashScreen> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _navigateAfterSplash(bool isLoggedIn) {
|
void _navigateAfterSplash(bool isLoggedIn) {
|
||||||
Timer(const Duration(seconds: 2), () {
|
Timer(const Duration(seconds: 1), () {
|
||||||
if (isLoggedIn == true) {
|
if (isLoggedIn == true) {
|
||||||
context.go(AppRoute.dashboard);
|
context.go(AppRoute.dashboard);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: _flutterfire_internals
|
name: _flutterfire_internals
|
||||||
sha256: "5534e701a2c505fed1f0799e652dd6ae23bd4d2c4cf797220e5ced5764a7c1c2"
|
sha256: eae3133cbb06de9205899b822e3897fc6a8bc278ad4c944b4ce612689369694b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.44"
|
version: "1.3.47"
|
||||||
animated_segmented_tab_control:
|
animated_segmented_tab_control:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -29,18 +29,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.11.0"
|
version: "2.12.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: boolean_selector
|
name: boolean_selector
|
||||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
bootstrap_icons:
|
bootstrap_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -61,42 +61,42 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: charcode
|
name: charcode
|
||||||
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
|
sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.1"
|
version: "1.4.0"
|
||||||
clock:
|
clock:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: clock
|
name: clock
|
||||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
collection:
|
collection:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.19.0"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: crypto
|
name: crypto
|
||||||
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
|
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.5"
|
version: "3.0.6"
|
||||||
csslib:
|
csslib:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: csslib
|
name: csslib
|
||||||
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
|
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.2"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -125,10 +125,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: equatable
|
name: equatable
|
||||||
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
|
sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.5"
|
version: "2.0.7"
|
||||||
event_bus:
|
event_bus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -141,10 +141,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fake_async
|
name: fake_async
|
||||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.1"
|
version: "1.3.2"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -165,58 +165,58 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: firebase_core
|
name: firebase_core
|
||||||
sha256: "51dfe2fbf3a984787a2e7b8592f2f05c986bfedd6fdacea3f9e0a7beb334de96"
|
sha256: fef81a53ba1ca618def1f8bef4361df07968434e62cb204c1fb90bb880a03da2
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.6.0"
|
version: "3.8.1"
|
||||||
firebase_core_platform_interface:
|
firebase_core_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_core_platform_interface
|
name: firebase_core_platform_interface
|
||||||
sha256: e30da58198a6d4b49d5bce4e852f985c32cb10db329ebef9473db2b9f09ce810
|
sha256: b94b217e3ad745e784960603d33d99471621ecca151c99c670869b76e50ad2a6
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.3.0"
|
version: "5.3.1"
|
||||||
firebase_core_web:
|
firebase_core_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_core_web
|
name: firebase_core_web
|
||||||
sha256: f967a7138f5d2ffb1ce15950e2a382924239eaa521150a8f144af34e68b3b3e5
|
sha256: "9e69806bb3d905aeec3c1242e0e1475de6ea6d48f456af29d598fb229a2b4e5e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.18.1"
|
version: "2.18.2"
|
||||||
firebase_messaging:
|
firebase_messaging:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: firebase_messaging
|
name: firebase_messaging
|
||||||
sha256: eb6e28a3a35deda61fe8634967c84215efc19133ba58d8e0fc6c9a2af2cba05e
|
sha256: "151a3ee68736abf293aab66d1317ade53c88abe1db09c75a0460aebf7767bbdf"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.1.3"
|
version: "15.1.6"
|
||||||
firebase_messaging_platform_interface:
|
firebase_messaging_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_messaging_platform_interface
|
name: firebase_messaging_platform_interface
|
||||||
sha256: b316c4ee10d93d32c033644207afc282d9b2b4372f3cf9c6022f3558b3873d2d
|
sha256: f331ee51e40c243f90cc7bc059222dfec4e5df53125b08d31fb28961b00d2a9d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.5.46"
|
version: "4.5.49"
|
||||||
firebase_messaging_web:
|
firebase_messaging_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_messaging_web
|
name: firebase_messaging_web
|
||||||
sha256: d7f0147a1a9fe4313168e20154a01fd5cf332898de1527d3930ff77b8c7f5387
|
sha256: efaf3fdc54cd77e0eedb8e75f7f01c808828c64d052ddbf94d3009974e47d30f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.9.2"
|
version: "3.9.5"
|
||||||
fl_chart:
|
fl_chart:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fl_chart
|
name: fl_chart
|
||||||
sha256: "94307bef3a324a0d329d3ab77b2f0c6e5ed739185ffc029ed28c0f9b019ea7ef"
|
sha256: "74959b99b92b9eebeed1a4049426fd67c4abc3c5a0f4d12e2877097d6a11ae08"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.69.0"
|
version: "0.69.2"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
@ -260,10 +260,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: go_router
|
name: go_router
|
||||||
sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc"
|
sha256: "2fd11229f59e23e967b0775df8d5948a519cd7e1e8b6e849729e010587b46539"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.3.0"
|
version: "14.6.2"
|
||||||
google_fonts:
|
google_fonts:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -276,10 +276,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: google_identity_services_web
|
name: google_identity_services_web
|
||||||
sha256: "5be191523702ba8d7a01ca97c17fca096822ccf246b0a9f11923a6ded06199b6"
|
sha256: "55580f436822d64c8ff9a77e37d61f5fb1e6c7ec9d632a43ee324e2a05c3c6c9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.1+4"
|
version: "0.3.3"
|
||||||
googleapis_auth:
|
googleapis_auth:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -292,10 +292,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: html
|
name: html
|
||||||
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
|
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.15.4"
|
version: "0.15.5"
|
||||||
http:
|
http:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -308,10 +308,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: http_parser
|
name: http_parser
|
||||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.1.1"
|
||||||
intl:
|
intl:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -332,18 +332,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.5"
|
version: "10.0.8"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.5"
|
version: "3.0.9"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -356,18 +356,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: lints
|
name: lints
|
||||||
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
|
sha256: "4a16b3f03741e1252fda5de3ce712666d010ba2122f8e912c94f9f7b90e1a4c3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.0"
|
version: "5.1.0"
|
||||||
logging:
|
logging:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: logging
|
name: logging
|
||||||
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.3.0"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -412,34 +412,34 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.0"
|
version: "1.9.1"
|
||||||
path_provider:
|
path_provider:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider
|
name: path_provider
|
||||||
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
|
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.1.5"
|
||||||
path_provider_android:
|
path_provider_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a
|
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.12"
|
version: "2.2.15"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_foundation
|
name: path_provider_foundation
|
||||||
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
|
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.4.1"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -468,10 +468,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: platform
|
name: platform
|
||||||
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
|
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.5"
|
version: "3.1.6"
|
||||||
plugin_platform_interface:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -492,18 +492,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
|
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.3"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
|
sha256: "7f172d1b06de5da47b6264c2692ee2ead20bbbc246690427cdb4fc301cd0c549"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.3"
|
version: "2.3.4"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -556,7 +556,7 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.99"
|
version: "0.0.0"
|
||||||
source_span:
|
source_span:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -569,10 +569,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
version: "1.12.0"
|
||||||
stream_channel:
|
stream_channel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -585,10 +585,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.4.0"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -601,18 +601,18 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.2"
|
version: "0.7.3"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: typed_data
|
name: typed_data
|
||||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.2"
|
version: "1.4.0"
|
||||||
universal_html:
|
universal_html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -641,10 +641,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.2.5"
|
version: "14.3.1"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -662,5 +662,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.5.1 <4.0.0"
|
dart: ">=3.6.0-0 <4.0.0"
|
||||||
flutter: ">=3.24.0"
|
flutter: ">=3.24.0"
|
||||||
|
|
|
||||||
BIN
upload-keystore.jks
Normal file
BIN
upload-keystore.jks
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user