Browse Source

config push notification

phase2_dev
Đại Võ 1 year ago
parent
commit
1b41d7b6dd
22 changed files with 391 additions and 132 deletions
  1. +1
    -1
      .fvm/flutter_sdk
  2. +1
    -1
      .fvm/fvm_config.json
  3. +3
    -3
      .vscode/launch.json
  4. +1
    -1
      .vscode/settings.json
  5. +8
    -18
      android/app/google-services.json
  6. +16
    -0
      android/app/src/main/AndroidManifest.xml
  7. +3
    -3
      android/build.gradle
  8. +10
    -4
      ios/Podfile.lock
  9. +12
    -11
      ios/Runner.xcodeproj/project.pbxproj
  10. +1
    -1
      ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  11. +15
    -0
      ios/Runner/AppDelegate.swift
  12. +6
    -10
      ios/Runner/GoogleService-Info.plist
  13. +3
    -1
      lib/app.dart
  14. +2
    -11
      lib/main.dart
  15. +4
    -3
      lib/presentation/custom_widgets/date_picker/date_picker_widget.dart
  16. +13
    -6
      lib/presentation/custom_widgets/widget_action_field_date.dart
  17. +12
    -5
      lib/presentation/custom_widgets/widget_field_time_picker.dart
  18. +4
    -1
      lib/presentation/screens/tabbar/tabbar.dart
  19. +155
    -0
      lib/services/firebase_notification_service.dart
  20. +4
    -0
      lib/utils/pref.dart
  21. +112
    -48
      pubspec.lock
  22. +5
    -4
      pubspec.yaml

+ 1
- 1
.fvm/flutter_sdk View File

/Users/daivph/fvm/versions/3.7.12
/Users/daivph/fvm/versions/3.13.9

+ 1
- 1
.fvm/fvm_config.json View File

{ {
"flutterSdkVersion": "3.7.12",
"flutterSdkVersion": "3.13.9",
"flavors": {} "flavors": {}
} }

+ 3
- 3
.vscode/launch.json View File

"name": "mobile-app", "name": "mobile-app",
"request": "launch", "request": "launch",
"type": "dart", "type": "dart",
"args": [
"--no-sound-null-safety"
]
// "args": [
// "--no-sound-null-safety"
// ]
} }
] ]
} }

+ 1
- 1
.vscode/settings.json View File

{ {
"dart.flutterSdkPath": "~/fvm/versions/3.7.12",
"dart.flutterSdkPath": "~/fvm/versions/3.13.9",
"java.configuration.updateBuildConfiguration": "interactive" "java.configuration.updateBuildConfiguration": "interactive"
} }

+ 8
- 18
android/app/google-services.json View File

{ {
"project_info": { "project_info": {
"project_number": "145264060024",
"firebase_url": "https://smartfarm-73071-default-rtdb.firebaseio.com",
"project_id": "smartfarm-73071",
"storage_bucket": "smartfarm-73071.appspot.com"
"project_number": "305595108522",
"firebase_url": "https://aztrace-nhatkycanhtac-default-rtdb.asia-southeast1.firebasedatabase.app",
"project_id": "aztrace-nhatkycanhtac",
"storage_bucket": "aztrace-nhatkycanhtac.appspot.com"
}, },
"client": [ "client": [
{ {
"client_info": { "client_info": {
"mobilesdk_app_id": "1:145264060024:android:5d973afbfdac70c8802f8d",
"mobilesdk_app_id": "1:305595108522:android:92fd0887475dc2723754d3",
"android_client_info": { "android_client_info": {
"package_name": "vn.azteam.farmdemo" "package_name": "vn.azteam.farmdemo"
} }
}, },
"oauth_client": [
{
"client_id": "145264060024-fpp54hk2mhfpk5nj1m23124p0nkr72l6.apps.googleusercontent.com",
"client_type": 3
}
],
"oauth_client": [],
"api_key": [ "api_key": [
{ {
"current_key": "AIzaSyAVC0ArwKauoiTms8VUpn7Y9_hY0MX5V3Y"
"current_key": "AIzaSyAzNujY3dPJgMP5p8FvH4SRkxv7dv8DH5I"
} }
], ],
"services": { "services": {
"appinvite_service": { "appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "145264060024-fpp54hk2mhfpk5nj1m23124p0nkr72l6.apps.googleusercontent.com",
"client_type": 3
}
]
"other_platform_oauth_client": []
} }
} }
} }

+ 16
- 0
android/app/src/main/AndroidManifest.xml View File

<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" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application <application
android:name=".Application" android:name=".Application"
android:label="Aztrace - Nhật ký canh tác" android:label="Aztrace - Nhật ký canh tác"
<meta-data <meta-data
android:name="com.google.firebase.messaging.default_notification_icon" android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_stat_smartfarm" /> android:resource="@mipmap/ic_stat_smartfarm" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="high_importance_channel" />
<!-- <activity <!-- <activity
android:name="de.mintware.barcode_scan.BarcodeScannerActivity" android:name="de.mintware.barcode_scan.BarcodeScannerActivity"
android:exported="true" android:exported="true"
android:resource="@xml/provider_paths" android:resource="@xml/provider_paths"
tools:replace="android:resource" /> tools:replace="android:resource" />
</provider> </provider>
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
</application> </application>
</manifest> </manifest>

+ 3
- 3
android/build.gradle View File

buildscript { buildscript {
ext.kotlin_version = '1.7.21'
ext.kotlin_version = '1.9.0'
repositories { repositories {
google() google()
jcenter() jcenter()
} }


dependencies { dependencies {
classpath("com.android.tools.build:gradle:7.0.0")
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.gms:google-services:4.3.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
} }


task clean(type: Delete) {
tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

+ 10
- 4
ios/Podfile.lock View File

- Mantle - Mantle
- SDWebImage - SDWebImage
- SDWebImageWebPCoder - SDWebImageWebPCoder
- flutter_local_notifications (0.0.1):
- Flutter
- FMDB (2.7.5): - FMDB (2.7.5):
- FMDB/standard (= 2.7.5) - FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5) - FMDB/standard (2.7.5)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- open_filex (from `.symlinks/plugins/open_filex/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `.symlinks/plugins/sqflite/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`)


SPEC REPOS: SPEC REPOS:
:path: Flutter :path: Flutter
flutter_image_compress_common: flutter_image_compress_common:
:path: ".symlinks/plugins/flutter_image_compress_common/ios" :path: ".symlinks/plugins/flutter_image_compress_common/ios"
flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios"
image_picker_ios: image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios" :path: ".symlinks/plugins/image_picker_ios/ios"
open_filex: open_filex:
package_info_plus: package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios" :path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation: path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/ios"
:path: ".symlinks/plugins/path_provider_foundation/darwin"
qr_code_scanner: qr_code_scanner:
:path: ".symlinks/plugins/qr_code_scanner/ios" :path: ".symlinks/plugins/qr_code_scanner/ios"
shared_preferences_foundation: shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite: sqflite:
:path: ".symlinks/plugins/sqflite/ios" :path: ".symlinks/plugins/sqflite/ios"


FirebaseMessaging: 0c0ae1eb722ef0c07f7801e5ded8dccd1357d6d4 FirebaseMessaging: 0c0ae1eb722ef0c07f7801e5ded8dccd1357d6d4
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084

+ 12
- 11
ios/Runner.xcodeproj/project.pbxproj View File

/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
572C33A325FB79E100842D5E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 572C33A225FB79E100842D5E /* GoogleService-Info.plist */; };
57039D382BEF24AA002F4393 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 57039D372BEF24AA002F4393 /* GoogleService-Info.plist */; };
57EDCFFA2BBC55CE005E5B0A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 57EDCFF92BBC55CE005E5B0A /* PrivacyInfo.xcprivacy */; }; 57EDCFFA2BBC55CE005E5B0A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 57EDCFF92BBC55CE005E5B0A /* PrivacyInfo.xcprivacy */; };
5A19B8D253A88BC5E5EDE8D2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DCE1C984F2603EE87603F8E /* Pods_Runner.framework */; }; 5A19B8D253A88BC5E5EDE8D2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DCE1C984F2603EE87603F8E /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
572C33A225FB79E100842D5E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
57039D372BEF24AA002F4393 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
57CB5602257E19450029CFCB /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; }; 57CB5602257E19450029CFCB /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
57EDCFF92BBC55CE005E5B0A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 57EDCFF92BBC55CE005E5B0A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
572C33A225FB79E100842D5E /* GoogleService-Info.plist */,
57039D372BEF24AA002F4393 /* GoogleService-Info.plist */,
57CB5602257E19450029CFCB /* Runner.entitlements */, 57CB5602257E19450029CFCB /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
57EDCFFA2BBC55CE005E5B0A /* PrivacyInfo.xcprivacy in Resources */, 57EDCFFA2BBC55CE005E5B0A /* PrivacyInfo.xcprivacy in Resources */,
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
572C33A325FB79E100842D5E /* GoogleService-Info.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
57039D382BEF24AA002F4393 /* GoogleService-Info.plist in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
files = ( files = (
); );
inputPaths = ( inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
); );
name = "Thin Binary"; name = "Thin Binary";
outputPaths = ( outputPaths = (
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 23;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = C3DTD2JH94; DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.1.7;
MARKETING_VERSION = 1.1.8;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo; PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 23;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = C3DTD2JH94; DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.1.7;
MARKETING_VERSION = 1.1.8;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo; PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 23;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = C3DTD2JH94; DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.1.7;
MARKETING_VERSION = 1.1.8;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo; PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

+ 1
- 1
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme View File

<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

+ 15
- 0
ios/Runner/AppDelegate.swift View File

import UIKit import UIKit
import Flutter import Flutter
import Firebase


@UIApplicationMain @UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate {
_ application: UIApplication, _ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
if #available(iOS 10.0, *) { if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
} }
application.registerForRemoteNotifications()

return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }
} }

+ 6
- 10
ios/Runner/GoogleService-Info.plist View File

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CLIENT_ID</key>
<string>145264060024-ut48ah57979rug9fti17nothlm2ckiij.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.145264060024-ut48ah57979rug9fti17nothlm2ckiij</string>
<key>API_KEY</key> <key>API_KEY</key>
<string>AIzaSyBWyE0r0AvSlfSZUlPGxwXT49qYX8fX7eo</string>
<string>AIzaSyDjiB8U1qE94jHiRTQMFIbJQXsopjA5RLc</string>
<key>GCM_SENDER_ID</key> <key>GCM_SENDER_ID</key>
<string>145264060024</string>
<string>305595108522</string>
<key>PLIST_VERSION</key> <key>PLIST_VERSION</key>
<string>1</string> <string>1</string>
<key>BUNDLE_ID</key> <key>BUNDLE_ID</key>
<string>vn.azteam.farmdemo</string> <string>vn.azteam.farmdemo</string>
<key>PROJECT_ID</key> <key>PROJECT_ID</key>
<string>smartfarm-73071</string>
<string>aztrace-nhatkycanhtac</string>
<key>STORAGE_BUCKET</key> <key>STORAGE_BUCKET</key>
<string>smartfarm-73071.appspot.com</string>
<string>aztrace-nhatkycanhtac.appspot.com</string>
<key>IS_ADS_ENABLED</key> <key>IS_ADS_ENABLED</key>
<false></false> <false></false>
<key>IS_ANALYTICS_ENABLED</key> <key>IS_ANALYTICS_ENABLED</key>
<key>IS_SIGNIN_ENABLED</key> <key>IS_SIGNIN_ENABLED</key>
<true></true> <true></true>
<key>GOOGLE_APP_ID</key> <key>GOOGLE_APP_ID</key>
<string>1:145264060024:ios:537b6f9f805f96ea802f8d</string>
<string>1:305595108522:ios:4c0f809f1569feb93754d3</string>
<key>DATABASE_URL</key> <key>DATABASE_URL</key>
<string>https://smartfarm-73071-default-rtdb.firebaseio.com</string>
<string>https://aztrace-nhatkycanhtac-default-rtdb.asia-southeast1.firebasedatabase.app</string>
</dict> </dict>
</plist> </plist>

+ 3
- 1
lib/app.dart View File

import 'authentication/bloc/authentication_bloc.dart'; import 'authentication/bloc/authentication_bloc.dart';
import 'data/repository/authentication_repository.dart'; import 'data/repository/authentication_repository.dart';
import 'presentation/screens/login/login_page.dart'; import 'presentation/screens/login/login_page.dart';
import 'services/firebase_notification_service.dart';


final GlobalKey<NavigatorState> globalNavigator = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> globalNavigator = GlobalKey<NavigatorState>();


backgroundColor: Colors.white, backgroundColor: Colors.white,
brightness: Brightness.light, brightness: Brightness.light,
primaryColor: AppColors.DEFAULT, primaryColor: AppColors.DEFAULT,
accentColor: AppColors.DEFAULT,
hoverColor: AppColors.GREEN, hoverColor: AppColors.GREEN,
// textTheme: GoogleFonts.sairaTextTheme( // textTheme: GoogleFonts.sairaTextTheme(
// Theme.of(context).textTheme, // Theme.of(context).textTheme,
listener: (context, state) { listener: (context, state) {
switch (state.status) { switch (state.status) {
case AuthenticationStatus.authenticated: case AuthenticationStatus.authenticated:
FirebaseNotificationService.initService();
// _navigator!.pushAndRemoveUntil<void>( // _navigator!.pushAndRemoveUntil<void>(
// TabbarScreen.route(), // TabbarScreen.route(),
// (route) => false, // (route) => false,
Get.offAll(() => TabbarScreen()); Get.offAll(() => TabbarScreen());
break; break;
case AuthenticationStatus.unauthenticated: case AuthenticationStatus.unauthenticated:
FirebaseNotificationService.initService();
// _navigator!.pushAndRemoveUntil<void>( // _navigator!.pushAndRemoveUntil<void>(
// LoginPage.route(), // LoginPage.route(),
// (route) => false, // (route) => false,

+ 2
- 11
lib/main.dart View File

final GlobalKey<NavigatorState> globalNavigator = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> globalNavigator = GlobalKey<NavigatorState>();
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
Firebase.initializeApp();
// if (Platform.isAndroid) {
// await Firebase.initializeApp(
// options: DefaultFirebaseOptions.currentPlatform,
// );
// } else {
// await Firebase.initializeApp();
// }
// await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true);
// FirebaseMessaging.onBackgroundMessage(FirebaseMessages.firebaseMessagingBackgroundHandler);
// FirebaseMessaging.onMessageOpenedApp.listen(FirebaseMessages.firebaseMessagingBackgroundHandler);

await Firebase.initializeApp();


await SystemChrome.setPreferredOrientations([ await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitDown, DeviceOrientation.portraitDown,

+ 4
- 3
lib/presentation/custom_widgets/date_picker/date_picker_widget.dart View File

import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart' as datatTimePicker;

import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
onTap: widget.isEnable onTap: widget.isEnable
? () { ? () {
widget.isShowTime widget.isShowTime
? DatePicker.showDateTimePicker(
? datatTimePicker.DatePicker.showDateTimePicker(
context, context,
showTitleActions: true, showTitleActions: true,
minTime: DateTime(DateTime.now().year - 5), minTime: DateTime(DateTime.now().year - 5),
} }
}, },
currentTime: selectedDate, currentTime: selectedDate,
locale: LocaleType.vi,
locale: datatTimePicker.LocaleType.vi,
) )
: showDatePicker( : showDatePicker(
context: context, context: context,

+ 13
- 6
lib/presentation/custom_widgets/widget_action_field_date.dart View File

import 'package:farm_tpf/utils/validators.dart'; import 'package:farm_tpf/utils/validators.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart' as datatTimePicker;
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:farm_tpf/utils/formatter.dart'; import 'package:farm_tpf/utils/formatter.dart';
height: 44, height: 44,
child: TextButton( child: TextButton(
onPressed: () { onPressed: () {
DatePicker.showDateTimePicker(context, showTitleActions: true, onChanged: (date) {}, onConfirm: (date) {
controller?.change(date);
widget.onPressed(date);
textController.text = date.toString();
}, currentTime: data?.selectedDateTime, locale: LocaleType.vi);
datatTimePicker.DatePicker.showDateTimePicker(
context,
showTitleActions: true,
onChanged: (date) {},
onConfirm: (date) {
controller?.change(date);
widget.onPressed(date);
textController.text = date.toString();
},
currentTime: data?.selectedDateTime,
locale: datatTimePicker.LocaleType.vi,
);
}, },
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

+ 12
- 5
lib/presentation/custom_widgets/widget_field_time_picker.dart View File

import 'package:farm_tpf/utils/const_style.dart'; import 'package:farm_tpf/utils/const_style.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart' as datatTimePicker;
import 'package:farm_tpf/utils/formatter.dart'; import 'package:farm_tpf/utils/formatter.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/state_manager.dart'; import 'package:get/state_manager.dart';
builder: (value) { builder: (value) {
return TextButton( return TextButton(
onPressed: () { onPressed: () {
DatePicker.showDateTimePicker(context, showTitleActions: true, onChanged: (date) {}, onConfirm: (date) {
changeDate.change(date);
widget.onUpdateDateTime(date);
}, currentTime: value.selectedDateTime, locale: LocaleType.vi);
datatTimePicker.DatePicker.showDateTimePicker(
context,
showTitleActions: true,
onChanged: (date) {},
onConfirm: (date) {
changeDate.change(date);
widget.onUpdateDateTime(date);
},
currentTime: value.selectedDateTime,
locale: datatTimePicker.LocaleType.vi,
);
}, },
child: Container( child: Container(
padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0), padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),

+ 4
- 1
lib/presentation/screens/tabbar/tabbar.dart View File



Future<Null> getSharedPrefs() async { Future<Null> getSharedPrefs() async {
token = await pref.getString(DATA_CONST.TOKEN_KEY); token = await pref.getString(DATA_CONST.TOKEN_KEY);
pushkey = await pref.getString(DATA_CONST.PUSH_KEY);
currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME); currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME);
var options = BaseOptions(baseUrl: ConstCommon.baseUrl); var options = BaseOptions(baseUrl: ConstCommon.baseUrl);
options.headers["Authorization"] = "Bearer $token"; options.headers["Authorization"] = "Bearer $token";
// } else { // } else {
// print("Don't need get push key"); // print("Don't need get push key");
// } // }
var pushKey = await pref.getString(PrefKey.push_key);
_userRepository.updateFcmToken(pushKey).then((value) {
print("send push key successful");
});


if (currentFullName?.isEmpty ?? true) { if (currentFullName?.isEmpty ?? true) {
try { try {

+ 155
- 0
lib/services/firebase_notification_service.dart View File

import 'dart:convert';

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get/get.dart';
import '../utils/pref.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class FirebaseNotificationService {
static FirebaseMessaging messaging = FirebaseMessaging.instance;
static final _pref = LocalPref();

static void initService() async {
var token = await messaging.getToken() ?? '';
await _pref.saveString(PrefKey.push_key, token);
print('pushKey: $token');

//config Android channel
const channel = AndroidNotificationChannel(
'high_importance_channel',
'High Importance Notifications',
importance: Importance.max,
);
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);

await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(
alert: true,
badge: true,
sound: true,
);

//handle message on background android
FirebaseMessaging.onBackgroundMessage(
_firebaseMessagingBackgroundHandler,
);

//Message foreground
FirebaseMessaging.onMessage.listen(
(RemoteMessage message) {
print('Got a message whilst in the foreground!');
print('Message data: $message');
// increase count unread notification
// countNotificationUnRead.value = countNotificationUnRead.value + 1;

var remoteNotification = message.notification;
var androidNotification = message.notification?.android;

var flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
const initializationSettingsAndroid = AndroidInitializationSettings(
'app_icon',
);
const initializationSettingsIOS = DarwinInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,
onDidReceiveLocalNotification: onDidReceiveLocalNotification,
);

const initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
);
flutterLocalNotificationsPlugin.initialize(
initializationSettings,
// onDidReceiveNotificationResponse: selectNotification,
onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) async {
await selectNotification(notificationResponse.payload);
},
);

var androidDetails = const AndroidNotificationDetails(
'default_notification_channel_id',
'Notification',
importance: Importance.max,
priority: Priority.high,
icon: '@mipmap/ic_stat_ic_notification',
);

var platformChannelSpecifics = NotificationDetails(
android: androidDetails,
);

var dataPayload = json.encode(message.data);
try {
// var entityType = message.data['entity_type'];
// var entityData = message.data['entity_data'];
// var systemMessage = message.data['system_message'];
print('normal message');
flutterLocalNotificationsPlugin.show(
0,
message.notification?.title,
message.notification?.body,
platformChannelSpecifics,
payload: dataPayload,
);
} catch (e) {
print(e);
}
},
);

@pragma('vm:entry-point')
void notificationTapBackground(NotificationResponse notificationResponse) {
// handle action
print('message from background: $notificationResponse');
}

//Interaction Message from background
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('message from background: ${message}');
_handleMessage(message);
});

//Interaction Message from terminal
var initialMessage = await FirebaseMessaging.instance.getInitialMessage();
print('initialMessage: $initialMessage');
if (initialMessage != null) {
_handleMessage(initialMessage);
}
}

static Future onDidReceiveLocalNotification(int? id, String? title, String? body, String? payload) async {
// display a dialog with the notification details, tap ok to go to another page
}

static Future selectNotification(String? payload) async {
try {
var data = json.decode(payload ?? '');
handleNavigateScreen(data);
} catch (e) {
print(e);
}
}

static void _handleMessage(RemoteMessage message) {
try {
var data = message.data;
handleNavigateScreen(data);
} catch (e) {
print(e);
}
}

static void handleNavigateScreen(dynamic data) {
print(data);
}
}

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print('Handling a background message: ${message}');
}

+ 4
- 0
lib/utils/pref.dart View File

static const String PUSH_KEY = "PUSH_KEY"; static const String PUSH_KEY = "PUSH_KEY";
static const String CURRENT_FULL_NAME = "CURRENT_FULL_NAME"; static const String CURRENT_FULL_NAME = "CURRENT_FULL_NAME";
} }

class PrefKey {
static const String push_key = 'push_key';
}

+ 112
- 48
pubspec.lock View File

dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.0"
version: "2.11.0"
auto_size_text: auto_size_text:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: build_config name: build_config
sha256: edd0f55c5af49a408311330cc84b213acc7491a85d6f2f890e503ffe00290176
sha256: ad77deb6e9c143a3f550fbb4c5c1e0c6aadabe24274898d06b9526c61b9cf4fb
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.6"
version: "1.0.0"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1"
version: "1.3.0"
checked_yaml: checked_yaml:
dependency: transitive dependency: transitive
description: description:
name: checked_yaml name: checked_yaml
sha256: d051b31d88264beeeef1fa971f19d9a1d614b157bc60dad5b3b360f996e48656
sha256: dd007e4fb8270916820a0d66e24f619266b60773cddd082c6439341645af2659
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.4"
version: "2.0.1"
cli_util: cli_util:
dependency: transitive dependency: transitive
description: description:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0"
version: "1.17.2"
convert: convert:
dependency: transitive dependency: transitive
description: description:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
dbus:
dependency: transitive
description:
name: dbus
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
url: "https://pub.dev"
source: hosted
version: "0.7.10"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.1" version: "3.3.1"
flutter_datetime_picker:
flutter_datetime_picker_plus:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_datetime_picker
sha256: "8e695c63c769350e541951227c2775190ec73ceda774a315b1dc9a99d5facfe5"
name: flutter_datetime_picker_plus
sha256: "7d82da02c4e070bb28a9107de119ad195e2319b45c786fecc13482a9ffcc51da"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.5.1"
version: "2.2.0"
flutter_image_compress: flutter_image_compress:
dependency: "direct main" dependency: "direct main"
description: description:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.3+2" version: "0.1.3+2"
flutter_local_notifications:
dependency: "direct main"
description:
name: flutter_local_notifications
sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef"
url: "https://pub.dev"
source: hosted
version: "17.1.2"
flutter_local_notifications_linux:
dependency: transitive
description:
name: flutter_local_notifications_linux
sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03"
url: "https://pub.dev"
source: hosted
version: "4.0.0+1"
flutter_local_notifications_platform_interface:
dependency: transitive
description:
name: flutter_local_notifications_platform_interface
sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7"
url: "https://pub.dev"
source: hosted
version: "7.1.0"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_svg name: flutter_svg
sha256: "138b19e7554e97d680dc391fb21639c89db979f437a74bd2ad5ff207c0082a5c"
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.20.0-nullsafety.3"
version: "2.0.10+1"
flutter_switch: flutter_switch:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: http name: http
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.13.6"
version: "1.1.0"
http_parser: http_parser:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.13"
version: "0.12.16"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0"
version: "0.5.0"
meta: meta:
dependency: "direct main" dependency: "direct main"
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.0"
version: "1.9.1"
mime: mime:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2"
path_drawing:
dependency: transitive
description:
name: path_drawing
sha256: "3bdd251dae9ffaef944450b73f168610db7e968e7b20daf0c3907f8b4aafc8a2"
url: "https://pub.dev"
source: hosted
version: "0.5.1+1"
version: "1.8.3"
path_parsing: path_parsing:
dependency: transitive dependency: transitive
description: description:
name: path_parsing name: path_parsing
sha256: ee5c47c1058ad66b4a41746ec3996af9593d0858872807bcd64ac118f0700337
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.1"
version: "1.0.1"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: petitparser name: petitparser
sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4"
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0"
version: "5.4.0"
platform: platform:
dependency: "direct overridden" dependency: "direct overridden"
description: description:
dependency: transitive dependency: transitive
description: description:
name: pubspec_parse name: pubspec_parse
sha256: d65b4c44175a6882692fae384be22c3eed8b9235bb758d8984b11fec55848b8c
sha256: "0e01f805457ef610ccaf8d18067596afc34107a27149778b06b2083edbc140c1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.8"
version: "1.1.0"
qr_code_scanner: qr_code_scanner:
dependency: "direct main" dependency: "direct main"
description: description:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1"
version: "1.10.0"
sprintf: sprintf:
dependency: transitive dependency: transitive
description: description:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16"
version: "0.6.0"
timezone:
dependency: transitive
description:
name: timezone
sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5
url: "https://pub.dev"
source: hosted
version: "0.9.3"
toggle_switch: toggle_switch:
dependency: "direct main" dependency: "direct main"
description: description:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.0" version: "4.1.0"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
win32: win32:
dependency: transitive dependency: transitive
description: description:
dependency: transitive dependency: transitive
description: description:
name: xml name: xml
sha256: "80d494c09849dc3f899d227a78c30c5b949b985ededf884cb3f3bcd39f4b447a"
sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.4.1"
version: "6.3.0"
yaml: yaml:
dependency: transitive dependency: transitive
description: description:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=2.19.0 <3.0.0"
flutter: ">=3.7.0"
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.10.0"

+ 5
- 4
pubspec.yaml View File

description: A new Flutter project. description: A new Flutter project.


publish_to: 'none' publish_to: 'none'
version: 1.1.8+24
version: 1.1.8+25


environment: environment:
sdk: ">=2.17.0 <=3.0.0"
sdk: ">=3.0.0 <4.0.0"


module: module:
androidX: true androidX: true
change_app_package_name: ^1.1.0 change_app_package_name: ^1.1.0
#flutter pub run change_app_package_name:main vn.azteam.farmdemo #flutter pub run change_app_package_name:main vn.azteam.farmdemo
firebase_messaging: ^14.7.0 firebase_messaging: ^14.7.0
flutter_local_notifications: ^17.1.2
get: ^4.1.2 get: ^4.1.2
intl: ^0.18.1 intl: ^0.18.1
flutter_datetime_picker: ^1.5.1
flutter_datetime_picker_plus: ^2.1.0
# http: ^1.1.0 # http: ^1.1.0
http_parser: ^4.0.2 http_parser: ^4.0.2
rflutter_alert: ^2.0.7 rflutter_alert: ^2.0.7


mime: ^1.0.4 mime: ^1.0.4
flutter_image_compress: ^2.1.0 flutter_image_compress: ^2.1.0
flutter_svg: ^0.20.0-nullsafety.3
flutter_svg: ^2.0.10+1
# google_fonts: ^6.1.0 # google_fonts: ^6.1.0
# ffi: ^1.0.0 # ffi: ^1.0.0
qr_code_scanner: ^1.0.1 qr_code_scanner: ^1.0.1

Loading…
Cancel
Save