Browse Source

master

master
jefry 4 years ago
parent
commit
c97ecd19e7
73 changed files with 4705 additions and 86 deletions
  1. +40
    -84
      .gitignore
  2. +10
    -0
      .metadata
  3. +15
    -2
      README.md
  4. +7
    -0
      android/.gitignore
  5. +63
    -0
      android/app/build.gradle
  6. +7
    -0
      android/app/src/debug/AndroidManifest.xml
  7. +48
    -0
      android/app/src/main/AndroidManifest.xml
  8. +6
    -0
      android/app/src/main/kotlin/com/example/assetstock/MainActivity.kt
  9. +12
    -0
      android/app/src/main/res/drawable/launch_background.xml
  10. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  11. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  12. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  13. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  14. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  15. +18
    -0
      android/app/src/main/res/values/styles.xml
  16. +7
    -0
      android/app/src/profile/AndroidManifest.xml
  17. +31
    -0
      android/build.gradle
  18. +4
    -0
      android/gradle.properties
  19. +6
    -0
      android/gradle/wrapper/gradle-wrapper.properties
  20. +15
    -0
      android/settings.gradle
  21. +1
    -0
      android/settings_aar.gradle
  22. +32
    -0
      ios/.gitignore
  23. +26
    -0
      ios/Flutter/AppFrameworkInfo.plist
  24. +1
    -0
      ios/Flutter/Debug.xcconfig
  25. +1
    -0
      ios/Flutter/Release.xcconfig
  26. +506
    -0
      ios/Runner.xcodeproj/project.pbxproj
  27. +7
    -0
      ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  28. +8
    -0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  29. +8
    -0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  30. +91
    -0
      ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  31. +7
    -0
      ios/Runner.xcworkspace/contents.xcworkspacedata
  32. +8
    -0
      ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  33. +8
    -0
      ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  34. +13
    -0
      ios/Runner/AppDelegate.swift
  35. +122
    -0
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  36. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  37. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  38. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  39. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  40. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  41. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  42. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  43. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  44. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  45. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  46. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  47. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  48. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  49. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  50. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  51. +23
    -0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  52. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  53. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  54. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  55. +5
    -0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  56. +37
    -0
      ios/Runner/Base.lproj/LaunchScreen.storyboard
  57. +26
    -0
      ios/Runner/Base.lproj/Main.storyboard
  58. +45
    -0
      ios/Runner/Info.plist
  59. +1
    -0
      ios/Runner/Runner-Bridging-Header.h
  60. +571
    -0
      lib/asset_details.dart
  61. +253
    -0
      lib/asset_logs.dart
  62. +506
    -0
      lib/home.dart
  63. +46
    -0
      lib/main.dart
  64. +959
    -0
      lib/stocking.dart
  65. +70
    -0
      lib/util/Models.dart
  66. +249
    -0
      lib/util/dbHandler.dart
  67. +168
    -0
      lib/util/download_Upload_Handler.dart
  68. +32
    -0
      lib/util/photo_viewer.dart
  69. +29
    -0
      lib/util/prefsKey.dart
  70. +84
    -0
      lib/util/utils.dart
  71. +362
    -0
      pubspec.lock
  72. +81
    -0
      pubspec.yaml
  73. +30
    -0
      test/widget_test.dart

+ 40
- 84
.gitignore View File

@@ -1,87 +1,43 @@
# ---> Android
# Built application files
*.apk
*.aar
*.ap_
*.aab

# Files for the ART/Dalvik VM
*.dex

# Java class files
# Miscellaneous
*.class *.class

# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log *.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# IntelliJ
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml *.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml

# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/

# Google Services (e.g. APIs or Firebase)
# google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md

# Version control
vcs.xml

# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/

*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/

# Web related
lib/generated_plugin_registrant.dart

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages

+ 10
- 0
.metadata View File

@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: b041144f833e05cf463b8887fa12efdec9493488
channel: stable

project_type: app

+ 15
- 2
README.md View File

@@ -1,3 +1,16 @@
# Asset-App
# assetstock


Flutter app for Asset Management
Application to check assets

## Getting Started

This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)

For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

+ 7
- 0
android/.gitignore View File

@@ -0,0 +1,7 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java

+ 63
- 0
android/app/build.gradle View File

@@ -0,0 +1,63 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
compileSdkVersion 28

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}

lintOptions {
disable 'InvalidPackage'
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.assetstock"
minSdkVersion 18
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}

flutter {
source '../..'
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

+ 7
- 0
android/app/src/debug/AndroidManifest.xml View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.assetstock">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

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

@@ -0,0 +1,48 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.assetstock">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="io.flutter.app.FlutterApplication"
android:label="assetstock"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>

+ 6
- 0
android/app/src/main/kotlin/com/example/assetstock/MainActivity.kt View File

@@ -0,0 +1,6 @@
package com.example.assetstock

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

+ 12
- 0
android/app/src/main/res/drawable/launch_background.xml View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />

<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File

Before After
Width: 72  |  Height: 72  |  Size: 544 B

BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File

Before After
Width: 48  |  Height: 48  |  Size: 442 B

BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File

Before After
Width: 96  |  Height: 96  |  Size: 721 B

BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File

Before After
Width: 144  |  Height: 144  |  Size: 1.0 KiB

BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png View File

Before After
Width: 192  |  Height: 192  |  Size: 1.4 KiB

+ 18
- 0
android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">@android:color/white</item>
</style>
</resources>

+ 7
- 0
android/app/src/profile/AndroidManifest.xml View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.assetstock">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

+ 31
- 0
android/build.gradle View File

@@ -0,0 +1,31 @@
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

allprojects {
repositories {
google()
jcenter()
}
}

rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
delete rootProject.buildDir
}

+ 4
- 0
android/gradle.properties View File

@@ -0,0 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true

+ 6
- 0
android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,6 @@
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip

+ 15
- 0
android/settings.gradle View File

@@ -0,0 +1,15 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

include ':app'

def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()

assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }

def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"

+ 1
- 0
android/settings_aar.gradle View File

@@ -0,0 +1 @@
include ':app'

+ 32
- 0
ios/.gitignore View File

@@ -0,0 +1,32 @@
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3

+ 26
- 0
ios/Flutter/AppFrameworkInfo.plist View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.0</string>
</dict>
</plist>

+ 1
- 0
ios/Flutter/Debug.xcconfig View File

@@ -0,0 +1 @@
#include "Generated.xcconfig"

+ 1
- 0
ios/Flutter/Release.xcconfig View File

@@ -0,0 +1 @@
#include "Generated.xcconfig"

+ 506
- 0
ios/Runner.xcodeproj/project.pbxproj View File

@@ -0,0 +1,506 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {

/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
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>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
97C146F11CF9000F007C117D /* Supporting Files */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
97C146F11CF9000F007C117D /* Supporting Files */ = {
isa = PBXGroup;
children = (
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.assetstock;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

+ 7
- 0
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

+ 8
- 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

+ 8
- 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

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

@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

+ 7
- 0
ios/Runner.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>

+ 8
- 0
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

+ 8
- 0
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

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

@@ -0,0 +1,13 @@
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

+ 122
- 0
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png View File

Before After
Width: 1024  |  Height: 1024  |  Size: 11 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png View File

Before After
Width: 20  |  Height: 20  |  Size: 564 B

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png View File

Before After
Width: 40  |  Height: 40  |  Size: 1.3 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png View File

Before After
Width: 60  |  Height: 60  |  Size: 1.6 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png View File

Before After
Width: 29  |  Height: 29  |  Size: 1.0 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png View File

Before After
Width: 58  |  Height: 58  |  Size: 1.7 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png View File

Before After
Width: 87  |  Height: 87  |  Size: 1.9 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png View File

Before After
Width: 40  |  Height: 40  |  Size: 1.3 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png View File

Before After
Width: 80  |  Height: 80  |  Size: 1.9 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png View File

Before After
Width: 120  |  Height: 120  |  Size: 2.6 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png View File

Before After
Width: 120  |  Height: 120  |  Size: 2.6 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png View File

Before After
Width: 180  |  Height: 180  |  Size: 3.7 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png View File

Before After
Width: 76  |  Height: 76  |  Size: 1.8 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png View File

Before After
Width: 152  |  Height: 152  |  Size: 3.2 KiB

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png View File

Before After
Width: 167  |  Height: 167  |  Size: 3.5 KiB

+ 23
- 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png View File

Before After
Width: 1  |  Height: 1  |  Size: 68 B

BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png View File

Before After
Width: 1  |  Height: 1  |  Size: 68 B

BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png View File

Before After
Width: 1  |  Height: 1  |  Size: 68 B

+ 5
- 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md View File

@@ -0,0 +1,5 @@
# Launch Screen Assets

You can customize the launch screen with your own desired assets by replacing the image files in this directory.

You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

+ 37
- 0
ios/Runner/Base.lproj/LaunchScreen.storyboard View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

+ 26
- 0
ios/Runner/Base.lproj/Main.storyboard View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

+ 45
- 0
ios/Runner/Info.plist View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>assetstock</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>

+ 1
- 0
ios/Runner/Runner-Bridging-Header.h View File

@@ -0,0 +1 @@
#import "GeneratedPluginRegistrant.h"

+ 571
- 0
lib/asset_details.dart View File

@@ -0,0 +1,571 @@
import 'dart:io';
import 'util/photo_viewer.dart';
import 'package:assetstock/util/dbHandler.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'main.dart';
import 'util/Models.dart';

class AssetDetails extends StatefulWidget {
// AssetDetails({Key key}) : super(key: key);
int no;
List<String>lokasi;
AssetDetails({this.no,this.lokasi});
@override
_AssetDetailsState createState() => _AssetDetailsState();
}

class _AssetDetailsState extends State<AssetDetails> with TickerProviderStateMixin {
final barCode = new TextEditingController();
final prefixCode = new TextEditingController();
final qty = new TextEditingController();
final ket = new TextEditingController();
TabController _controller;
int _currentIndex;
Asset _asset = new Asset();
final focusNode = new FocusNode();
bool isAppend = false;

loadAsset()async{
var blob = await DBHelper.database.getBlobbyNo(widget.no);
if(blob!=null){
var result = await DBHelper.database.searchbyTagNumber(blob.tag_number.toUpperCase());
if(result['DATA']!=null) {
result['DATA'].blob = blob.blob;
result['DATA'].no = widget.no;
result['DATA'].keterangan = blob.keterangan;
}
else util.showToast('Alert', 'Asset data not found');
String tag_number = result['DATA'].tag_number;
int separator = tag_number.lastIndexOf('/')+1;
setState(() {
_asset = result['DATA'];
prefixCode.text = tag_number.substring(0,separator);
barCode.text = tag_number.substring(separator);
ket.text = result['DATA'].keterangan;
});
}
else{
util.showToast('Alert', 'Asset data not found');
}
}

@override
void initState() {
// TODO: implement initState
super.initState();
qty.text='1';
_controller = new TabController(length: 1, vsync: this);
_controller.addListener(() {
setState(() {
_currentIndex = _controller.index;
});
});
if(widget.no!=null){
loadAsset();
}
}
findAsset(query,{silent=false})async{
var result = await DBHelper.database.searchbyTagNumber(query.toUpperCase());
if(result['DATA']!=null){
if(result['EXIST']){
if(widget.no==null){
setState(() {
isAppend=false;
barCode.text = '';
ket.text = '';
_asset = new Asset();
});
FocusScope.of(context).requestFocus(focusNode);
}
else{
String tag_number = _asset.tag_number;
int separator = tag_number.lastIndexOf('/')+1;
setState(() {
prefixCode.text = tag_number.substring(0,separator);
barCode.text = tag_number.substring(separator);
});
}
if(!silent)util.showToast('Alert', 'Asset data already inserted');
}
else{
var image;
if(_asset.blob!=null)image=_asset.blob;
setState(() {
isAppend=false;
_asset = result['DATA'];
if(image!=null)_asset.blob = image;
_asset.no = widget.no;
});
}
}
else{
var image;
if(_asset.blob!=null)image=_asset.blob;
setState(() {
// barCode.text = '';
isAppend=true;
// ket.text = '';
_asset = new Asset();
if(image!=null)_asset.blob = image;
_asset.tag_number = query.toUpperCase();
_asset.no = widget.no;
});
// FocusScope.of(context).requestFocus(focusNode);
if(!silent)util.showToast('Alert', 'Asset data not found');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: true,
body: Container(
padding: EdgeInsets.only(top: 20,bottom: 50),
color: Colors.grey.withOpacity(0.3),
child: Column(
children: <Widget>[
Expanded(
flex: 5,
child: Column(
children: <Widget>[
Expanded(
flex:18,
child: TabBarView(
controller: _controller,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top:20,left: 20,right: 20),
child: Stack(
children: <Widget>[
Container(color: Colors.grey,),
Positioned.fill(child: InkWell(onTap: ()async{
var image = await picker.getImage(source: ImageSource.camera,imageQuality: 60,maxWidth: 600);
if(image!=null){
_asset.blob = await image.readAsBytes();
setState(() {
});
print(File(image.path).lengthSync()/1024);
File(image.path).deleteSync();
}
},child: Container(
decoration: BoxDecoration(
image: (_asset!=null&&_asset.blob!=null)?DecorationImage(
image: MemoryImage(_asset.blob),
fit: BoxFit.fitWidth
):null
),
child: (_asset!=null&&_asset.blob!=null)?null:Icon(Icons.camera_alt,size: 200,color: Colors.white,))))
],
),
),
// Padding(
// padding: EdgeInsets.only(top:20,left: 20,right: 20),
// child: Stack(
// children: <Widget>[
// Container(color: Colors.grey,),
// Positioned.fill(child: InkWell(onTap: ()async{
// await picker.getImage(source: ImageSource.camera);
// },child: Container(child: Icon(Icons.camera_alt,size: 200,color: Colors.white,))))
// ],
// ),
// ),
],
),
),
Expanded(
flex:1,
child:
Container(
// color: Colors.grey,
// child: TabBar(
// indicatorColor: Colors.blueGrey,
// controller: _controller,
// labelColor: Colors.blueGrey,
// labelStyle: TextStyle(
// fontSize: 17,
// fontWeight: FontWeight.bold
// ),
// unselectedLabelStyle: TextStyle(
// fontSize: 16
// ),
// indicatorSize: TabBarIndicatorSize.label,
// tabs: <Widget>[
// Tab(
// text: 'Asset',
// ),
// Tab(
// text: 'Barcode',
// ),
// ],
// ),
)
),
],
),
),
Expanded(
flex: 5,
child: Container(
color: Colors.white,
padding: EdgeInsets.all(20),
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
(_asset.tag_number!=null)?Container(
alignment: Alignment.centerRight,
child: InkWell(
onTap: ()async {
var result = await DBHelper.database.getRefBlob(_asset.tag_number);
if(result!=null){
if(result.blob!=null) Navigator.push(context, MaterialPageRoute(builder: (context) => PhotoViewer(result.blob,)));
else util.showToast('ALERT', "No Archived Images yet");
}
else util.showToast('ALERT', "No Archived Images yet");
//showPhoto
},
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text('Archived images',style: TextStyle(color: Colors.indigo, decoration: TextDecoration.underline,),),
),
),
):Container(),
(_asset.tag_number!=null)?SizedBox(height: 5,):Container(),
Row(
children: <Widget>[
Expanded(
flex:3,
child: Container(
child: TextField(
controller: prefixCode,
autofocus: (widget.no==null),
onSubmitted: (value)async{
String query = value.replaceAll('*', '');
query = query.substring(0,query.lastIndexOf('/')+1);
setState(() {
prefixCode.text = query;
});
if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text);
else FocusScope.of(context).requestFocus(focusNode);
},
decoration: InputDecoration(
hintText: "Prefix code",
alignLabelWithHint: true,
),
),
),
),
SizedBox(width: 10,),
Expanded(
flex:3,
child: Container(
child: TextField(
controller: barCode,
focusNode: focusNode,
autofocus: (widget.no==null),
onSubmitted: (value)async{
String query = value.replaceAll('*', '');
if(prefixCode.text!=''){
query = query.replaceAll(prefixCode.text.toUpperCase(), '');
}
else{
if(query.contains('/'))query = query.substring(query.lastIndexOf('/'));
util.showToast('ALERT', 'Please fill the prefix first');
}
setState(() {
barCode.text = query;
});
if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text);
},
decoration: InputDecoration(
hintText: "Suffix / Barcode",
alignLabelWithHint: true,
suffixIcon: InkWell(onTap: ()async{
if(prefixCode.text!=''){
var scan = await util.scan();
if(scan['STATUS']==1){
String query = scan['DATA'];
// print("$query != ${prefixCode.text.toUpperCase()}");
setState(() {
query = query.trim().replaceAll(prefixCode.text.toUpperCase(), '');
barCode.text = query;
});
if(prefixCode.text!=''&&barCode.text!='')await findAsset(prefixCode.text+barCode.text);
}
}
else util.showToast('ALERT', 'Please fill the prefix first');
},child: Icon(Icons.center_focus_strong))
),
),
),
),
Expanded(flex: 1,
child: Container(
alignment: Alignment.centerRight,
child: Text('Qty :'),
),),
Expanded(
flex:2,
child: Container(
child: TextField(
enabled: false,
keyboardType: TextInputType.number,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(8)
),
controller: qty,
),
),
),
],
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('Note ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: TextField(
controller: ket,
decoration: InputDecoration(
hintText: "Insert Note here",
),
),
),
],
),
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('Asset No ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: Text((_asset.asset_no??'-')=='null'?'-':_asset.asset_no??'-',style: TextStyle(fontSize: 16),),
),
],
),
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('Asset Desc ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: Text(_asset.asset_desc??'-',style: TextStyle(fontSize: 16),),
),
],
),
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('PIC ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: Text(_asset.pic??'-',style: TextStyle(fontSize: 16),),
),
],
),
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('Lantai ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: Text(_asset.lantai??'-',style: TextStyle(fontSize: 16),),
),
],
),
),
SizedBox(height: 5,),
Container(
alignment: Alignment.centerLeft,
height: 50,
child: Row(
children: <Widget>[
Expanded(
flex : 3,
child: Text('Ruang ',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 1,
child: Text(':',style: TextStyle(fontSize: 16),),
),
Expanded(
flex : 7,
child: Text(_asset.ruangan??'-',style: TextStyle(fontSize: 16),),
),
],
),
),
// SizedBox(height: 5,),
// Container(
// alignment: Alignment.centerLeft,
// height: 50,
// child: Row(
// children: <Widget>[
// Expanded(
// flex : 3,
// child: Text('Gedung ',style: TextStyle(fontSize: 16),),
// ),
// Expanded(
// flex : 1,
// child: Text(':',style: TextStyle(fontSize: 16),),
// ),
// Expanded(
// flex : 7,
// child: Text(_asset.gedung??'-',style: TextStyle(fontSize: 16),),
// ),
// ],
// ),
// ),
],
),
),
),
),
],
),
),
bottomSheet: Container(
height: 50,
// color: Colors.grey.withOpacity(0.3),
child: Row(
children: <Widget>[
Expanded(
flex: 5,
child: FlatButton(
onPressed: ()async{
if(barCode.text!=''&&prefixCode.text!='')await findAsset(prefixCode.text+barCode.text,silent: true);
else _asset.tag_number = null;
if(_asset.tag_number!=null&&_asset.blob!=null){
_asset.keterangan = ket.text;
bool upsertReady = !isAppend;
if(isAppend){
upsertReady = await showDialog(context: context,builder: (context)=>WillPopScope(
onWillPop: ()async{
Navigator.pop(context,false);
return false;
},
child: AlertDialog(
title: Text('Append New Asset'),
content: Text('${(widget.no==null)?'Insert':'Update'} brand new asset?'),
actions: <Widget>[
FlatButton(
onPressed: ()async{
Navigator.pop(context,true);
},
child: Text('Save'),
),
FlatButton(
onPressed: ()async{
Navigator.pop(context,false);
},
child: Text('Cancel'),
)
],
),
));
}
if(upsertReady){
if(widget.no==null){
var insert = await DBHelper.database.insertAsset(_asset);
if(insert!=null){
util.showToast("SUCCESS", 'Asset Inserted');
await DBHelper.database.closeDb();
setState(() {
barCode.text = '';
ket.text = '';
_asset = new Asset();
});
FocusScope.of(context).requestFocus(focusNode);
}
}
else{
var update = await DBHelper.database.updateAsset(_asset);
if(update!=null){
util.showToast("SUCCESS", 'Asset Updated');
await DBHelper.database.closeDb();
Navigator.pop(context);
}
}
}
}
else{
util.showToast('ERROR', 'Please complete the asset data');
}
},
color: Colors.green,
child: Container(alignment: Alignment.center,height: 50,
child: Text('Save')),
),
),
Expanded(
flex: 5,
child: FlatButton(
onPressed: (){
Navigator.pop(context);
},
color: Colors.red,
child: Container(alignment: Alignment.center,height:50,child: Text('Cancel')),
),
),
],
),
),
);
}
}

+ 253
- 0
lib/asset_logs.dart View File

@@ -0,0 +1,253 @@
import 'package:assetstock/util/dbHandler.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'util/prefsKey.dart';
import 'main.dart';
import 'util/Models.dart';
import 'package:matrix_gesture_detector/matrix_gesture_detector.dart';

class AssetLogs extends StatefulWidget {
AssetLogs({Key key}) : super(key: key);

@override
_AssetLogsState createState() => _AssetLogsState();
}

class _AssetLogsState extends State<AssetLogs> {
List<Asset> nonAuditedAsset = [];
double widthtb = 900;
double scale=1;
final searchCon = TextEditingController();
final scaleCon = TextEditingController();
String search = '';
fetchData()async{
var dbName = await DBHelper.database.getDbName();
// result.
var result = await util.JsonDataPostRaw({"dbName" : dbName , "redirect" : "FALSE" , "auditedData" : "FALSE"}, "${prefs.getString(keyClass.hostAddress)??"http://172.16.4.144:3000"}/admin/data/dbDetail");
if(result['STATUS']!='ERROR'){
var arrayList = result['DATA']['nonAuditedData'];
nonAuditedAsset.clear();
for(int i = 0 ; i <arrayList.length ; i++){
// print(arrayList[i]);
nonAuditedAsset.add(Asset.fromJson(arrayList[i]));
}
setState(() {

});
}
else{
util.showToast('ALERT', "Can't reach the server.");
Navigator.pop(context);
}
}

@override
void initState() {
fetchData();
scaleCon.text = scale.toStringAsFixed(2);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: false,
body: Container(
padding: EdgeInsets.only(top: 10),
color: Colors.grey.withOpacity(0.3),
child: Column(
children: [
Expanded(
flex: 2,
child: Container(
alignment: Alignment.bottomCenter,
padding: const EdgeInsets.all(8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
// padding: EdgeInsets.all(8),
child: TextField(
controller: searchCon,
onSubmitted: (value)async{
setState(() {
search = value;
// searchCon.text = value;
});
// await loadAsset(loading: true);
},
decoration: InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
suffixIcon: InkWell(
onTap: ()async{
var result = await util.scan();
if(result['STATUS']==1){
searchCon.text = result['DATA'];
search = searchCon.text;
// await loadAsset();
setState(() {

});
}
},
child: Icon(Icons.center_focus_strong,color: Colors.blueGrey,)),
contentPadding: EdgeInsets.only(left: 10,right: 10,top: 15,bottom: 15),
hintText: "Search Tag Number"
),
),
),
),
),
Expanded(
flex:1,
child: Padding(
padding: EdgeInsets.all(5),
child: Row(
children: [
Expanded(
flex:7,
child: Container(
alignment: Alignment.centerLeft,
child: Text('Non-Audited Asset : ${nonAuditedAsset.length} asset(s)'),
),
),
Expanded(
flex: 1,
child: Container(
child: Text('Scale : ')
),
),
Expanded(
flex: 1,
child: Container(padding: EdgeInsets.only(bottom: 5.0),child: TextField(
controller: scaleCon,
keyboardType: TextInputType.number,
onSubmitted: (value){
try{
scale = double.parse(value);
if(scale>=1.00&&scale<=3.00){
setState(() {

widthtb = 900 *scale;
});
}
else{
util.showToast('ERROR', 'Scale must be between 1.00 - 3.00');
}
}
catch(e){
util.showToast('ERROR', 'Scale must be between 1.00 - 3.00');
}
},
))),
],
),
),
),
Expanded(
flex:18,
child: Container(
color: Colors.white,
child: ListView(
scrollDirection: Axis.horizontal,
children: [
Container(
child: Column(
children: [
Container(
decoration: BoxDecoration(
border: Border.all(width: 1.0)
),
width: widthtb,
child: Row(
children: [
Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('No',style: TextStyle(fontWeight: FontWeight.bold),)),
Container(width: widthtb*0.09,child: Text('Tag Number',style: TextStyle(fontWeight: FontWeight.bold))),
Container(width: widthtb*0.24,child: Text('Asset Desc',style: TextStyle(fontWeight: FontWeight.bold))),
Container(width: widthtb*0.24,child: Text('PIC',style: TextStyle(fontWeight: FontWeight.bold))),
Container(width: widthtb*0.13,child: Text('Gedung',style: TextStyle(fontWeight: FontWeight.bold))),
Container(width: widthtb*0.125,child: Text('Lantai',style: TextStyle(fontWeight: FontWeight.bold))),
Container(width: widthtb*0.13,child: Text('Ruang',style: TextStyle(fontWeight: FontWeight.bold))),

],
),
),
Expanded(
child: MatrixGestureDetector(
onMatrixUpdate: (m,t,s,r){
scale = MatrixGestureDetector.decomposeToValues(m).scale+1;
if(scale>3)scale=3;
setState(() {
scaleCon.text = scale.toStringAsFixed(2);
widthtb = 900 *scale;
// scaleheighttb = 0.04*scale;
});
},
child: Container(
decoration: BoxDecoration(
border: Border.all(width: 1.0)
),
width: widthtb,
child: ListView.builder(
padding: EdgeInsets.all(0.0),
itemCount: nonAuditedAsset.length,
itemBuilder: (context,index){
Asset idxAsset = nonAuditedAsset[index];
if(search!=''){
if(idxAsset.tag_number.toUpperCase().contains(search.toUpperCase())) return Container(
decoration: BoxDecoration(
border: Border(bottom: BorderSide(width: 0.8))
),
child: Row(
children: [
Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('${index+1}')),
Container(width: widthtb*0.09,child: Text(idxAsset.tag_number)),
Container(width: widthtb*0.24,child: Text(idxAsset.asset_desc)),
Container(width: widthtb*0.24,child: Text(idxAsset.pic)),
Container(width: widthtb*0.13,child: Text(idxAsset.gedung)),
Container(width: widthtb*0.125,child: Text(idxAsset.lantai)),
Container(width: widthtb*0.13,child: Text(idxAsset.ruangan)),
],
),
);
else return Container();
}
else{
return Container(
decoration: BoxDecoration(
border: Border(bottom: BorderSide(width: 0.8))
),
child: Row(
children: [
Container(padding: EdgeInsets.only(left: 5.0),width: widthtb*0.035,child: Text('${index+1}')),
Container(width: widthtb*0.09,child: Text(idxAsset.tag_number)),
Container(width: widthtb*0.24,child: Text(idxAsset.asset_desc)),
Container(width: widthtb*0.24,child: Text(idxAsset.pic)),
Container(width: widthtb*0.13,child: Text(idxAsset.gedung)),
Container(width: widthtb*0.125,child: Text(idxAsset.lantai)),
Container(width: widthtb*0.13,child: Text(idxAsset.ruangan)),
],
),
);
}
}),
),
),
),
],
),
),
],
),
)
),
],
),
),
);
}
}

+ 506
- 0
lib/home.dart View File

@@ -0,0 +1,506 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:assetstock/util/download_Upload_Handler.dart';
import 'package:path/path.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'main.dart';
import 'util/prefsKey.dart';
import 'util/dbHandler.dart';

class Home extends StatefulWidget {
Home({Key key}) : super(key: key);

@override
_HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
List<Widget> Menus = [];
final hostAddress = new TextEditingController();
StreamSubscription _dlulStream;
double progress,progressDL;
loadMenu()async{
Menus.add(Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5)
),
child: Text('Get Data'),
),
));

setState(() {
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
// await loadMenu();
});
}

clearData(context)async{
String errMsg;
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
File db = File(path);
if(db.existsSync()){
bool result = await showDialog(context: context,builder: (context)=>WillPopScope(
onWillPop: ()async{
Navigator.pop(context,false);
return false;
},
child: AlertDialog(
title: Text('Clear Data ?'),
content: Text('Proceed to clear any remaining units data on this device?'),
actions: <Widget>[
FlatButton(
child: Text('Proceed'),
onPressed: ()async{
util.showLoading(context);
await Future.sync(()async{
await prefs.remove(keyClass.dbName);
// await prefs.setString(keyClass.lastDownload, null);
// await prefs.setString(keyClass.lastUpload, null);
// await prefs.setString(keyClass.targetProccess, null);
setState(() {
// lastUpload = '';
// lastDownload = '';
// timeString = '';
});
// var result = await DBHelper.database.deleteAll();
// if(result!=null) {

// if(result!=null){
try{
await DBHelper.database.closeDb();
db.deleteSync();
}
catch(e){
print(e);
util.showToast('ERROR','Failed to delete database file');
}
// }
// else{
// errMsg = 'Failed to clear unit data';
// }
// }
// else{
// errMsg = 'Failed to clear unit data';
// }
});
Navigator.pop(context);
Navigator.pop(context,true);
util.showToast(errMsg==null?"SUCCESS":"ERROR",errMsg??'Data Cleared');
},
),
FlatButton(
child: Text('Cancel'),
onPressed: (){Navigator.pop(context,false);},
)
],
),
));
return result;
}
else return true;
}

@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: Padding(
padding: const EdgeInsets.only(bottom:45.0),
child: FloatingActionButton(
onPressed: ()async{
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
File db = File(path);
if(db.existsSync()){
Navigator.pushNamed(context, '/logs');
}
else{
util.showToast("ALERT", 'Get data Master first');
}
},
child: Icon(Icons.description,size: 30,),
),
),
body: Container(
color: Colors.grey.withOpacity(0.3),
child:
// (Menus.length==0)?Container(alignment: Alignment.center,
// child: Text('Empty',
// style: TextStyle(fontSize: 20,color: Colors.black38,fontWeight: FontWeight.bold),),)
// :
Column(
children: <Widget>[
Expanded(
flex: 1,
child: Container(
padding: const EdgeInsets.only(left: 10,top:10,right: 5),
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
Icon(Icons.dashboard,color: Colors.blueGrey,size: 20,),
SizedBox(width: 5,),
Text('Menu')
],
),
PopupMenuButton(
itemBuilder: (context)=>[
PopupMenuItem(
value: "changeAddress",
child: Row(
children: <Widget>[
Icon(Icons.network_wifi,color: Colors.blueGrey,),
SizedBox(width: 10,),
Text('Change Host Address',style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.w500),)
],
),
)
],
onSelected: (value)async{
if(value == "changeAddress"){
hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://asset.thamringroup.web.id';
await showDialog(context: context,builder: (context)=>AlertDialog(
title: Text('Set IP Address'),
content: TextField(
controller: hostAddress,
onSubmitted: (value){
prefs.setString(keyClass.hostAddress,(value=='')?'https://asset.thamringroup.web.id':value);
Navigator.pop(context);
},
),
actions: <Widget>[
FlatButton(
child: Text('OK'),
onPressed: (){
prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://asset.thamringroup.web.id':hostAddress.text);
Navigator.pop(context);
},
)
],
));
setState(() {

});
}
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(Icons.clear_all,color: Colors.blueGrey,size: 20,),
),
),
],
),
),
),
Flexible(
flex: 10,
child: Container(
alignment: Alignment.topCenter,
child: GridView.count(
padding: EdgeInsets.all(0),
crossAxisCount: 2,
children: [
InkWell(
onTap: ()async{
// await Future.delayed(Duration(milliseconds: 300));
String Address = prefs.getString(keyClass.hostAddress);
util.showLoading(context,dissmissable: false);
var result = await util.JsonDataPostRaw({}, "${Address??"https://asset.thamringroup.web.id"}/admin/getDbList");
Navigator.pop(context);
if(result['STATUS']==1){
bool isClear = await clearData(context);
if(isClear??false){
String selected = result['DATA'][0];
bool res =await showDialog(context: context,builder: (context)=>StatefulBuilder(
builder: (context,setState)=>AlertDialog(
title: Text('Pick Database'),
content: DropdownButtonFormField(
onChanged: (value){
setState(() {
selected = value;
});
},
value: selected,
items: new List<DropdownMenuItem<dynamic>>.from(result['DATA'].map((value){
String showText = value;
if(showText.length>30) showText = showText.substring(0,30);
return DropdownMenuItem(
child: Text(showText),
value: value,
);
})),
),
actions: <Widget>[
FlatButton(
onPressed: ()async{
Navigator.pop(context,true);
},
child: Text('Get'),
),
FlatButton(
onPressed: ()async{
Navigator.pop(context,false);
},
child: Text('Cancel'),
)
],
),
));
if(res??false){
// util.showLoading(context,dissmissable: false);
await prefs.setString(keyClass.dbName,selected);
file_Trans_Handler trans = new file_Trans_Handler();
await trans.downloadFile("assets.db", "${Address??"https://asset.thamringroup.web.id"}/admin/downloadDb/$selected");
_dlulStream = trans.progress.listen((value)async {
setState(() {
progressDL = (value!=-1.0)?value:null;
});
if(value!=null&&value >= 1.0) {
_dlulStream.cancel();
progressDL = null;
// setState(() {
// lastDownload = DateTime.now().toIso8601String();
// });
// await prefs.setString(keyClass.lastDownload, lastDownload);
// await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_START',value: DateFormat('dd-MM-yyyy HH:mm:ss').format(DateTime.parse(lastDownload))));
// await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_STOCK_TAKING',value: DateFormat('dd-MM-yyyy').format(DateTime.parse(lastDownload))));
// await DBHelper.database.closeDb();
// var allUnits = await DBHelper.database.getAllAsset();
// print('${allUnits.length} Units');
util.showToast('ALERT','Data Downloaded');
}
if(value==-1.0){
util.showToast('ALERT','Data Error ${trans.error}');
}
});
// Navigator.pop(context);
setState(() {

});
}
}
}
else{
await util.showToast("ERROR",result['ERROR']);
}
},
child: Padding(
padding: const EdgeInsets.only(left: 10,top:10,right: 5),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 4,
child: Container(alignment: Alignment.center,child: (progressDL==null)?Icon(Icons.add_to_home_screen,size: 100,color: Colors.blueGrey,):Stack(
children: <Widget>[
Container(width: 100,height: 100,child: CircularProgressIndicator(backgroundColor: Color(0xFFB4B4B4),valueColor:new AlwaysStoppedAnimation<Color>(Colors.blueGrey),value: progressDL,)),
Container(width: 100,height: 100,alignment: Alignment.center,child: Text("${(progressDL*100).floor().toString()}%",style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.bold,fontSize: 25),),)
],
)),
),
Flexible(
flex: 2,
child: Text('Get Data Master',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),),
),
],
),
),
),
),
Padding(
padding: const EdgeInsets.only(left: 5,top:10,right: 10),
child: Material(
color: Colors.white,
child: InkWell(
onTap: ()async{
await Future.delayed(Duration(milliseconds: 300));
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
File db = File(path);
if(db.existsSync())Navigator.pushNamed(context, '/stocking');
else{
util.showToast('Alert', 'Please download data master first');
}
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10)
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 4,
child: Container(alignment: Alignment.center,child: Icon(Icons.aspect_ratio,size: 100,color: Colors.blueGrey,)),
),
Flexible(
flex: 2,
child: Text('Start Stocking',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),),
),
],
),
),
),
),
),
InkWell(
onTap: ()async{
final file = File(
"${(await getApplicationDocumentsDirectory()).path}/assets.db");
if(file.existsSync()){
TextEditingController sendingUser = new TextEditingController();
sendingUser.text = prefs.getString(keyClass.user)??'';
bool isUserDefined = await showDialog(context: context,
barrierDismissible: false,
builder: (context)=>AlertDialog(
title: Text('Sender'),
content: TextField(
controller: sendingUser,
),
actions: [
FlatButton(
child: Text('Send'),
onPressed: ()async{
if(sendingUser.text!='') Navigator.pop(context,true);
else Navigator.pop(context,false);
},
)
],
));
if(isUserDefined??false){
prefs.setString(keyClass.user, sendingUser.text);
util.showToast("ALERT",'Preparing Data');
await DBHelper.database.closeDb();
file_Trans_Handler trans = new file_Trans_Handler();
util.showToast("ALERT",'Sending Data');
setState(() {
progress = 0;
});
trans.uploadFile("assets.db", "${prefs.getString(keyClass.hostAddress)??"https://asset.thamringroup.web.id"}/admin/uploadSqliteDb",sendingUser.text,context);
_dlulStream = trans.progress.listen((value) async {
setState(() {
progress = (value!=-1.0)?value:null;
});
if(value!=null&&value >= 1.0) {
if(trans.error==''&&trans.isFinish){
_dlulStream.cancel();
progress = null;
util.showToast("SUCCESS",(trans.success!='')?trans.success:'Data uploaded');
}
}
if(value==-1.0&&trans.isFinish){
_dlulStream.cancel();
progress = null;
util.showToast("ERROR",'Data upload error. ${trans.error}');
}
});
}
else util.showToast("ALERT",'Sending user not filled');
}
else{
util.showToast("ALERT",'No database file found');
}
},
child: Padding(
padding: const EdgeInsets.only(left: 10,top:10,right: 5),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 4,
child: Container(alignment: Alignment.center,child: (progress==null)?Icon(Icons.send,size: 100,color: Colors.blueGrey,):Stack(
children: <Widget>[
Container(width: 100,height: 100,child: CircularProgressIndicator(backgroundColor: Color(0xFFB4B4B4),valueColor:new AlwaysStoppedAnimation<Color>(Colors.blueGrey),value: progress,)),
Container(width: 100,height: 100,alignment: Alignment.center,child: Text("${(progress*100).floor().toString()}%",style: TextStyle(color: Colors.blueGrey,fontWeight: FontWeight.bold,fontSize: 25),),)
],
)),
),
Flexible(
flex: 2,
child: Text('Send Data',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),),
),
],
),
),
),
),
InkWell(
onTap: ()async{
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
File db = File(path);
if(db.existsSync()) await clearData(context);
else util.showToast('Alert', 'No database file found');
},
child: Padding(
padding: const EdgeInsets.only(left: 5,top:10,right: 10),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 4,
child: Container(alignment: Alignment.center,child: Icon(Icons.delete,size: 100,color: Colors.blueGrey,)),
),
Flexible(
flex: 2,
child: Text('Clear Data',style: TextStyle(color: Colors.blueGrey,fontSize: 18,fontWeight: FontWeight.bold),),
),
],
),
),
),
),
],
),
),
),
Flexible(
flex: 1,
child: Container(
padding: EdgeInsets.all(8),
alignment: Alignment.bottomRight,
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text((prefs.getString(keyClass.dbName)!=null)?"Master Data : ${prefs.getString(keyClass.dbName)}":'',style: TextStyle(color: Colors.blueGrey),),
Text('Connected to ${prefs.getString(keyClass.hostAddress)??'https://asset.thamringroup.web.id'}',style: TextStyle(color: Colors.blueGrey),),
],
),
),
),
],
),
),
);
}
}

+ 46
- 0
lib/main.dart View File

@@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'home.dart';
import 'stocking.dart';
import 'asset_logs.dart';
import 'package:image_picker/image_picker.dart';
import 'asset_details.dart';
import 'util/utils.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:fluttertoast/fluttertoast.dart';


final picker = ImagePicker();
Util util = new Util();
SharedPreferences prefs;
void main()async {
WidgetsFlutterBinding.ensureInitialized();
prefs = await SharedPreferences.getInstance();
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) {
runApp(new MyApp());
});
}

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
debugShowMaterialGrid: false,
title: 'AssetStocks',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(),
routes: {
'/home': (context) => new Home(),
'/stocking': (context) => new Stocking(),
'/details': (context) => new AssetDetails(),
'/logs' : (context) => new AssetLogs(),
},
);
}
}

+ 959
- 0
lib/stocking.dart View File

@@ -0,0 +1,959 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'main.dart';
import 'util/Models.dart';
import 'util/dbHandler.dart';
import 'asset_details.dart';

class Stocking extends StatefulWidget {
Stocking({Key key}) : super(key: key);

@override
_StockingState createState() => _StockingState();
}

class _StockingState extends State<Stocking> with TickerProviderStateMixin {
final searchCon = new TextEditingController();
String search = '';
TabController _tabController;
List<Asset> refAsset = [];
List<Asset> insertAsset = [];
bool isLoading = false;
List<String> lokasi = [];
List<String> ruangan = [];
String _currentloc='All';
String _currentruang='All';

loadAsset({loading=false})async{
if(loading) {
setState(() {
isLoading = true;
});
}
var result = (search=='')?await DBHelper.database.getAllAsset():await DBHelper.database.filterAllAsset(search.toUpperCase());
if(result!=null){
if(_currentloc!='All') result.removeWhere((element) => (element.lantai!=_currentloc));
if(_currentruang!='All') result.removeWhere((element) => (element.ruangan!=_currentruang));
setState(() {
refAsset = result;
});
// print(result.length);
}
result = (search=='')?await DBHelper.database.getAllInsertAsset():await DBHelper.database.filterAllInsertAsset(search.toUpperCase());
if(result!=null){
print(result.length);
if(_currentloc!='All'){
if(_currentloc!='Appended'){
result.removeWhere((element) => (element.lantai!=_currentloc));
}
else{
result.removeWhere((element) => (element.asset_desc!=''));
}
}
if(_currentruang!='All') result.removeWhere((element) => (element.ruangan!=_currentruang));
setState(() {
insertAsset = result.reversed.toList();
});
}
if(lokasi.length==0){
var results = await DBHelper.database.getAllLocation();
if(results!=null){
lokasi.clear();
lokasi = new List<String>.from(results.map((item)=>item.lantai));
lokasi.add('Appended');
lokasi.add('All');
}
}
ruangan.clear();
var results = (_currentloc=='All')?await DBHelper.database.getAllRuangan():await DBHelper.database.getLantaiRuangan(_currentloc);
setState(() {
if(results!=null){
ruangan = new List<String>.from(results.map((item)=>item.ruangan));
ruangan.add('All');
}
});


if(loading) {
setState(() {
isLoading = false;
});
}
}

@override
void initState() {
// TODO: implement initState
super.initState();
_tabController = new TabController(length: 2, vsync: this);
loadAsset(loading: true);
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomPadding: false,
body: Stack(
children: <Widget>[
Container(
padding: EdgeInsets.only(top: 10),
color: Colors.grey.withOpacity(0.3),
child: Column(
children: <Widget>[
Expanded(
flex: 2,
child: Container(
alignment: Alignment.bottomCenter,
padding: const EdgeInsets.all(8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
// padding: EdgeInsets.all(8),
child: TextField(
controller: searchCon,
onSubmitted: (value)async{
setState(() {
search = value;
// searchCon.text = value;
});
await loadAsset(loading: true);
},
decoration: InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
suffixIcon: InkWell(
onTap: ()async{
var result = await util.scan();
if(result['STATUS']==1){
searchCon.text = result['DATA'];
search = searchCon.text;
await loadAsset();
setState(() {

});
}
},
child: Icon(Icons.center_focus_strong,color: Colors.blueGrey,)),
contentPadding: EdgeInsets.only(left: 10,right: 10,top: 15,bottom: 15),
hintText: "Search Tag Number"
),
),
),
),
),
Expanded(
flex: 1,
child: Container(
alignment: Alignment.bottomCenter,
padding: const EdgeInsets.all(8.0),
child: Container(
// padding: EdgeInsets.all(8),
child: Row(
children: [
Container(
child: Text("Lantai : ",style: TextStyle(fontSize: 16),),
),
Container(
width: 100,
child: DropdownButtonFormField(
decoration: InputDecoration.collapsed(hintText: null),
value: _currentloc,
items: new List<DropdownMenuItem<String>>.from(lokasi.reversed.map((value){
return DropdownMenuItem(
child: Text(value),
value: value,
);
})),
onChanged: (value){
if(_currentloc!= value){
setState(() {
_currentruang = 'All';
_currentloc=value;
});
loadAsset(loading: true);
}

},
),
),
Container(
child: Text("Ruang : ",style: TextStyle(fontSize: 16)),
),
Expanded(
child: DropdownButtonFormField(
decoration: InputDecoration.collapsed(hintText: null),
value: _currentruang,
items: new List<DropdownMenuItem<String>>.from(ruangan.reversed.map((value){
String _string = value;
if(_string.length>18) _string = _string.substring(0,18);
return DropdownMenuItem(
child: Text(_string),
value: value,
);
})),
onChanged: (value){
setState(() {
_currentruang=value;
});
loadAsset(loading: true);
},
),
),
],
),
),
),
),
Expanded(
flex:16,
child: Column(
children: <Widget>[
Flexible(
flex: 1,
child: Stack(
children: <Widget>[
Positioned.fill(child: Row(
children: <Widget>[
Expanded(
flex:1,
child: Container(
alignment: Alignment.center,
child:(insertAsset.length==0)?null:Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: Text('Completed ',style: TextStyle(fontSize: 18,color: Colors.transparent),),
),
Container(padding: EdgeInsets.all(8),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.green,
),
child: Text('${insertAsset.length}',style: TextStyle(color: Colors.white,fontSize: 14/(insertAsset.length.toString().length/10+1)),)),
],
)
),
),
Expanded(
flex:1,
child: Container(
alignment: Alignment.center,
child:(refAsset.length==0)?null:Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: Text('InProgress ',style: TextStyle(fontSize: 18,color: Colors.transparent),),
),
Container(padding: EdgeInsets.all(8),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
),
child: Text('${refAsset.length-insertAsset.where((element) => (element.asset_desc!='')).length}',style: TextStyle(color: Colors.white,fontSize: 14/((refAsset.length-insertAsset.length).toString().length/10+1)),)),
],
)
),
),
],
),),
TabBar(
labelColor: Colors.blueGrey,
labelStyle: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),
unselectedLabelStyle: TextStyle(fontSize: 15),
controller: _tabController,
tabs: <Widget>[
Tab(
text: 'Completed',
),
Tab(
text: 'inProgress',
),
],
),
],
),
),
Expanded(
flex: 12,
child: TabBarView(
controller: _tabController,
children: <Widget>[
(insertAsset.length==0)?Center(child: Text('No Asset Data',style: TextStyle(color: Colors.grey,fontSize: 16,fontWeight: FontWeight.bold),),):
Scrollbar(
isAlwaysShown: false,
child: ListView.builder(
padding: EdgeInsets.all(0),
itemCount: insertAsset.length,
itemBuilder: (context,index){
return InkWell(
onTap: ()async{
await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(no:insertAsset[index].no,lokasi: lokasi,)));
// await Navigator.pushNamed(context, "/details");
await loadAsset();
},
child: Padding(
padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5)
),
height: 100,
child: Row(
children: <Widget>[
Container(height: 100,width: 100,decoration:BoxDecoration(
image:insertAsset[index].blob==null?null: DecorationImage(
image: MemoryImage(insertAsset[index].blob,),
fit: BoxFit.cover
),
color:Colors.grey,
borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
),child:insertAsset[index].blob==null?Icon(Icons.image):null,),
Expanded(
flex: 7,
child: Container(padding: EdgeInsets.all(5),
height: 180,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Row(
children: <Widget>[
Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
Expanded(flex: 6,child: Text(insertAsset[index].tag_number,style: TextStyle(color: (insertAsset[index].asset_desc!='')?Colors.black:Colors.red,fontSize: 16,fontWeight: FontWeight.bold))),
Expanded(flex: 1,child: InkWell(onTap: ()async{
await showDialog(context: context,
barrierDismissible: true,
builder: (context)=>AlertDialog(
title: Text('Delete Asset?'),
content: Text("Delete this asset (${insertAsset[index].tag_number})?"),
actions: [
FlatButton(
child: Text('Delete'),
onPressed: ()async{
var res = await DBHelper.database.deleteInsertAsset(insertAsset[index].no);
if(res!=null){
setState(() {
insertAsset.removeAt(index);
});
util.showToast('SUCCESS', 'Deleted');
}
else{
util.showToast('ERROR', 'Delete failed');
}
Navigator.pop(context);
},
)
],
));
},child: Container(alignment: Alignment.centerRight,child: Icon(Icons.cancel,color: Colors.red,),)),),
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Lokasi",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Keterangan",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].keterangan,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
],
),
],
),),
)
],
),
),
),
);
// String keyString = insertAsset[index].tag_number+insertAsset[index].asset_desc+insertAsset[index].ruangan+insertAsset[index].lantai+insertAsset[index].ruangan;
// if(search=='') return InkWell(
// onTap: ()async{
// await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(tagNumber: insertAsset[index].tag_number,)));
//// await Navigator.pushNamed(context, "/details");
// await loadAsset();
// },
// child: Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// image:insertAsset[index].blob==null?null: DecorationImage(
// image: MemoryImage(insertAsset[index].blob,),
// fit: BoxFit.cover
// ),
// color:Colors.grey,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:insertAsset[index].blob==null?Icon(Icons.image):null,),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// height: 180,
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text(insertAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan+' '+insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].gedung,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// );
// else{
// if(keyString.toUpperCase().contains(search.toUpperCase())) return InkWell(
// onTap: ()async{
// await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(tagNumber: insertAsset[index].tag_number,)));
//// await Navigator.pushNamed(context, "/details");
// await loadAsset();
// },
// child: Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// image:insertAsset[index].blob==null?null: DecorationImage(
// image: MemoryImage(insertAsset[index].blob,),
// fit: BoxFit.cover
// ),
// color:Colors.grey,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:insertAsset[index].blob==null?Icon(Icons.image):null,),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// height: 180,
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text(insertAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].asset_desc,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].ruangan+' '+insertAsset[index].lantai,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(insertAsset[index].gedung,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// );
// else return Container();
// }
}
),
),
Scrollbar(
isAlwaysShown: false,
child: ListView.builder(
padding: EdgeInsets.all(0),
itemCount: refAsset.length,
itemBuilder: (context,index){
return Opacity(
opacity: (refAsset[index].flag=='TRUE')?0.5:1,
child: Padding(
padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5)
),
height: 100,
child: Row(
children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// image:refAsset[index].blob==null?null: DecorationImage(
// image: MemoryImage(refAsset[index].blob,),
// fit: BoxFit.cover
// ),
// color:Colors.grey,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image,color: (refAsset[index].blob==null)?Colors.black:Colors.transparent,),),
Expanded(
flex: 7,
child: Container(padding: EdgeInsets.all(5),
height: 180,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Row(
children: <Widget>[
Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black)))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
],
),
Row(
children: <Widget>[
Expanded(flex:3,child: Container(height: 16,child: Text("Lantai",style: TextStyle(fontSize: 14,),))),
Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
],
),
],
),),
)
],
),
),
),
);
// String keyString = refAsset[index].tag_number+refAsset[index].asset_desc+refAsset[index].ruangan+refAsset[index].lantai+refAsset[index].ruangan;
// if(search=='') return Opacity(
// opacity: (refAsset[index].flag=='TRUE')?0.5:1,
// child: Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// image:refAsset[index].blob==null?null: DecorationImage(
// image: MemoryImage(refAsset[index].blob,),
// fit: BoxFit.cover
// ),
// color:Colors.grey,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// height: 180,
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan+' '+refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].gedung,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// );
// else{
// if(keyString.toUpperCase().contains(search.toUpperCase())) return Opacity(
// opacity: (refAsset[index].flag=='TRUE')?0.5:1,
// child: Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// image:refAsset[index].blob==null?null: DecorationImage(
// image: MemoryImage(refAsset[index].blob,),
// fit: BoxFit.cover
// ),
// color:Colors.grey,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// height: 180,
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Text("Tag Number",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text(refAsset[index].tag_number,style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold,color: Colors.black)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Asset Desc",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].asset_desc,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Ruang",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].ruangan+' '+refAsset[index].lantai,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:3,child: Container(height: 16,child: Text("Gedung",style: TextStyle(fontSize: 14,),))),
// Expanded(flex:1,child: Container(height: 16,child: Text(":",style: TextStyle(fontSize: 16,)))),
// Expanded(flex: 7,child: SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(height: 16,child: Text(refAsset[index].gedung,style: TextStyle(fontSize: 16,color: Colors.black,fontWeight: FontWeight.bold)))))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// );
// else return Container();
// }
}
),
),
// ListView(
// padding: EdgeInsets.all(0),
// children: <Widget>[
// Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// color:Colors.red,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// color:Colors.red,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// color:Colors.red,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// Padding(
// padding: const EdgeInsets.only(bottom: 8,left: 8,right: 8),
// child: Container(
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(5)
// ),
// height: 100,
// child: Row(
// children: <Widget>[
// Container(height: 100,width: 100,decoration:BoxDecoration(
// color:Colors.red,
// borderRadius: BorderRadius.only(topLeft: Radius.circular(5),bottomLeft: Radius.circular(5))
// ),child:Icon(Icons.image),),
// Expanded(
// flex: 7,
// child: Container(padding: EdgeInsets.all(5),
// child: Column(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// children: <Widget>[
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Kode",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Nama",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// Row(
// children: <Widget>[
// Expanded(flex:2,child: Text("Ruang",style: TextStyle(fontSize: 14,),)),
// Expanded(flex:1,child: Text(":",style: TextStyle(fontSize: 16,))),
// Expanded(flex: 7,child: Text("aaaa",style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold)))
// ],
// ),
// ],
// ),),
// )
// ],
// ),
// ),
// ),
// ],
// ),
],
),
),
],
),
),
],
),
),
Container(
alignment: Alignment.center,
child: (isLoading)?CircularProgressIndicator():null,
)
],
),
floatingActionButton: FloatingActionButton(
onPressed: ()async{
await Navigator.push(context, MaterialPageRoute(builder: (context) => new AssetDetails(lokasi: lokasi,)));
await loadAsset();
},
backgroundColor: Colors.blueGrey,
child: Icon(Icons.add),
),
);
}
}

+ 70
- 0
lib/util/Models.dart View File

@@ -0,0 +1,70 @@
import 'prefsKey.dart';
class Asset{
String tag_number;
var blob;
String asset_no;
String asset_desc;
String pic;
String gedung;
String lantai;
String ruangan;
String flag;
int no;
String keterangan;


Asset({
this.tag_number,
this.blob,
this.asset_no,
this.asset_desc,
this.pic,
this.gedung,
this.lantai,
this.ruangan,
this.flag,
this.no,
this.keterangan,
});

factory Asset.fromJson(Map<String, dynamic> json) {
return new Asset(
tag_number: json[columnName.tag_number]??'',
blob: json[columnName.blob]??null,
asset_no: json[columnName.asset_number]??'',
asset_desc: json[columnName.asset_desc]??'',
pic: json[columnName.pic]??'',
gedung : json[columnName.gedung]??'',
lantai: json[columnName.lantai]??'',
ruangan: json[columnName.ruang]??'',
flag: json[columnName.flag]??'',
no: json [columnName.no]??0,
keterangan: json[columnName.keterangan]??'',
);}

Map<String, dynamic> toJson() => {
columnName.tag_number: tag_number,
columnName.blob: blob,
columnName.asset_number : asset_no,
columnName.asset_desc : asset_desc,
columnName.pic: pic,
columnName.gedung: gedung,
columnName.lantai :lantai,
columnName.ruang :ruangan,
columnName.flag :flag,
columnName.no :no,
columnName.keterangan :keterangan,
};
}

class Count{
int count;
Count({
this.count
});

factory Count.fromJson(Map<String, dynamic> json) {
return new Count(
count: json['Count']??'',
);}
}

+ 249
- 0
lib/util/dbHandler.dart View File

@@ -0,0 +1,249 @@
import 'package:assetstock/util/Models.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'prefsKey.dart';
import 'dart:io';
import 'dart:async';
import 'package:path/path.dart';

class DBHelper{
DBHelper._();

static final DBHelper database = DBHelper._();
Database _db;

Future<Database> get db async {
if (_db != null) return _db;
_db = await initDb();
return _db;
}

initDb() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
var theDb = await openDatabase(path, version: 1,onCreate: _onCreate);
return theDb;
}
closeDb() async {
if(_db!=null){
final database = await db;
await database.close();
_db = null;
}
}

void _onCreate(Database db, int version) async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "assets.db");
File file = File(path);
print('Database created, ${file.lengthSync()}');
}

insertAsset(Asset newAsset) async{
try{
final database = await db;
await database.rawInsert("Insert into ${tableName.insert} (${columnName.tag_number},${columnName.blob},${columnName.keterangan}) VALUES(?,?,?)", [newAsset.tag_number,newAsset.blob,newAsset.keterangan]);
await database.rawQuery("UPDATE ${tableName.ref} SET ${columnName.flag} = 'TRUE' WHERE ${columnName.tag_number} = '${newAsset.tag_number}'");
return true;
}
catch(e){
print(e);
return null;
}
}

updateAsset(Asset newAsset) async{
try{
final database = await db;
await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]);
return true;
}
catch(e){
print(e);
return null;
}
}

getBlobbyNo(no) async{
try{
final database = await db;
var res = await database.query(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]);
// var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no");
// print(a);
return res.isNotEmpty ? Asset.fromJson(res.first): null;
}
catch(e){
print(e);
return null;
}
}
getRefBlob(tagNumber)async{
try{
final database = await db;
var res = await database.query(tableName.ref,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
// var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no");
// print(a);
return res.isNotEmpty ? Asset.fromJson(res.first): null;
}
catch(e){
print(e);
return null;
}
}
searchbyTagNumber(tagNumber) async{
try{
final database = await db;
var exist = await database.query(tableName.insert,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
var res = await database.query(tableName.ref,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
if(res.isEmpty&&exist.isNotEmpty){
var appendAsset = new Asset();
appendAsset.tag_number=tagNumber;
return {"EXIST":exist.isNotEmpty?true:false,"DATA":appendAsset};
}
else return {"EXIST":exist.isNotEmpty?true:false,"DATA":res.isNotEmpty ? Asset.fromJson(res.first): null};
}
catch(e){
print(e);
return null;
}
}

getAllLocation() async{
try{
final database = await db;
var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.lantai}) ${columnName.lantai} from ${tableName.ref} ORDER BY UPPER(${columnName.lantai})");
List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}
getAllRuangan() async{
try{
final database = await db;
var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} ORDER BY UPPER(${columnName.ruang})");
List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}

getLantaiRuangan(lantai) async{
try{
final database = await db;
var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} WHERE UPPER(${columnName.lantai}) = UPPER('$lantai') ORDER BY UPPER(${columnName.ruang})");
List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}


getAllAsset() async {
try{
final database = await db;
var res = await database.rawQuery("SELECT a.${columnName.tag_number}, a.${columnName.asset_desc}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number} ORDER BY a.${columnName.flag},a.${columnName.ruang}");
List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}

filterAllAsset(search) async {
try{
final database = await db;
var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.tag_number}, a.${columnName.asset_desc}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%' ORDER BY ${columnName.flag},${columnName.ruang}");
List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}

getAllInsertAsset() async {
try{
final database = await db;
// var res = await database.rawQuery("SELECT a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}");
var res = await database.rawQuery("select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}");

List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}
deleteInsertAsset(no) async{
try{
final database = await db;
// await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]);
await database.delete(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]);
return true;
}
catch(e){
print(e);
return null;
}
}

filterAllInsertAsset(search) async {
try{
final database = await db;
// var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.no},a.${columnName.keterangan},a.${columnName.tag_number},a.${columnName.blob}, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'");
var res = await database.rawQuery("SELECT * FROM (select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'");

List<Asset> list =
res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
return list;
}
catch(e){
print(e);
return null;
}
}
countRows(tableName)async{
try{
final database = await db;
var res = await database.rawQuery("SELECT Count(*) Count FROM $tableName");
return res.isEmpty?0:Count.fromJson(res.first).count;
}
catch(e){
print(e);
return null;
}
}
getDbName()async{
try{
final database = await db;
var res = await database.rawQuery("SELECT ${columnName.value} FROM ${tableName.key} where ${columnName.key} = 'DB_MASTER_NAME'");
return res.isEmpty?null:res.first[columnName.value];
}
catch(e){
print(e);
return null;
}
}

}

+ 168
- 0
lib/util/download_Upload_Handler.dart View File

@@ -0,0 +1,168 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:assetstock/util/prefsKey.dart';
import 'package:flutter/cupertino.dart';
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart';
import 'package:path/path.dart';
import 'package:async/async.dart';
import 'dart:io';
import 'utils.dart';

class file_Trans_Handler {
// double _progress = 0;
Util util = new Util();
String _path = '';
StreamSubscription dlulStream;
String _error = '';
String _success = '';
bool _finish = false;
get isFinish => _finish;
get path => _path;
get error => _error;
get success => _success;
StreamController _progress = new StreamController<double>();
Stream<double> get progress =>_progress.stream;
var client = new Client();
downloadFile(String fileName,String link) async {
StreamedResponse _response;
List<int> _bytes = [];
int _total = 0;
print('Start Download');
_progress.add(null);
try {
Request req = new Request('GET', Uri.parse(link));
// req.headers = '';
_response = await client.send(req).timeout(
Duration(seconds: 20));
// _response = await client.get('$link',headers: 'application/json')
_total = _response.contentLength;
print('${_total / 1024} KB');
dlulStream = _response.stream.listen((value) {
_bytes.addAll(value);
_progress.add(((_bytes.length / _total)));
})
..onDone(() async {
_progress.add(0.0);
print('Finish Download');
final file = File(
"${(await getApplicationDocumentsDirectory()).path}/$fileName");
await file.writeAsBytes(_bytes);
_path = file.path;
})
..onError((e) async {
print('Error Download, $e');
_progress.add(-1.0);
_error = e.toString();
});
}
catch(e){
print('Error Download, $e');
_progress.add(-1.0);
_error = e.toString();
}
}

uploadFile(String fileName,String link,String user,context) async{
StreamedResponse _response;
int _total;
List<int> _bytes = [];
_finish = false;
final file = File(
"${(await getApplicationDocumentsDirectory()).path}/$fileName");
_total = file.lengthSync();
print(_total/1024);
try{
var request = MultipartRequest('POST', Uri.parse(link));
request.files.add(await MultipartFile.fromPath('sqliteDb', file.path));
request.fields[keyClass.user] = user;

// _response = await client.send(request).timeout(Duration(seconds: 8));
print(["sadasdasda",await util.checkinternet()]);
if(await util.checkinternet()){
util.showLoading(context,dissmissable: false,onwillpop: ()async{return false;});
_response = await client.send(request);
print("MASIH JALAN");
if(_response.statusCode==200){
_error = '';_success = '';
dlulStream = _response.stream.listen((value) {
_bytes.addAll(value);
_progress.add((_bytes.length / _total));
try{
var result = jsonDecode(utf8.decode(value));
if(result['STATUS']==0) {
_error = result['DATA'];
_finish = true;
}
else if(result['STATUS']==1){
_error = '';
_success = result['DATA'];
_finish = true;
}
}catch(e){
}
})
..onDone(()async {
Navigator.pop(context);
client?.close();
_finish = true;

print("sdasdasdsd $_error");
if(_error!=''){
_progress.add(-1.0);
print('Error Upload, $_error');
}
else{
_progress.add(1.0);
print('Finish Upload');
print('done');
}
})
..onError((e){
Navigator.pop(context);
client?.close();
print('Error Upload, $e');
_progress.add(-1.0);
_error = e.toString();
});
}
else{
Navigator.pop(context);
client?.close();
var resBody = await _response.stream.bytesToString();
_progress.add(-1.0);
_finish = true;
_error = resBody;
}
}
else{
client?.close();
_progress.add(-1.0);
_finish = true;
_error = "Check Internet Connection";
}
}
// on TimeoutException{
// client?.close();
// print(['error timed out']);
// Navigator.pop(context);
// _progress.add(-1.0);
// _finish = true;
// _error = "Request timed out. Please check connection";
// }
catch(e){
client?.close();
print(['error',e]);
_finish = true;
_progress.add(-1.0);
_error = e.toString();
}
}
cancel()async{
client?.close();
await dlulStream?.cancel();
_progress?.close();
}
}

+ 32
- 0
lib/util/photo_viewer.dart View File

@@ -0,0 +1,32 @@
import 'dart:typed_data';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart';
import 'utils.dart';

class PhotoViewer extends StatefulWidget {
Uint8List byte;
PhotoViewer(this.byte);
// PhotoViewer({Key key}) : super(key: key);
@override
_PhotoViewerState createState() => _PhotoViewerState();
}

class _PhotoViewerState extends State<PhotoViewer> {
Util util = new Util();
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Flexible(
flex: 8,
child: Container(
child: PhotoView(
imageProvider: MemoryImage(widget.byte),
),
),
),
],
);
}
}

+ 29
- 0
lib/util/prefsKey.dart View File

@@ -0,0 +1,29 @@
class keyClass{
static String hostAddress = "HOST_ADDRESS";
static String dbName = "dbName";
static String user ="user";
}

class tableName{
static String insert = "insertTable";
static String ref = "refTable";
static String key = "settingTable";
}

class columnName{
static String jumlah = "JUMLAH";
static String blob = "BLOB_DATA";
static String asset_number = 'ASSET_NUMBER';
static String tag_number = 'TAG_NUMBER';
static String asset_desc = "ASSET_DESCRIPTION";
static String pic = 'PIC';
static String gedung = 'GEDUNG';
static String lantai = 'LANTAI';
static String ruang = 'RUANGAN';
static String flag = 'FLAG_INSERTED';
static String no = 'NO';
static String location = 'LOCATION';
static String keterangan = 'KETERANGAN';
static String value = "VALUE";
static String key = "ID";
}

+ 84
- 0
lib/util/utils.dart View File

@@ -0,0 +1,84 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:barcode_scan/barcode_scan.dart';
import 'package:fluttertoast/fluttertoast.dart';
import '../main.dart';
class Util{
scan()async{
String BarcodeText ='';
try{
ScanResult result = await BarcodeScanner.scan();
BarcodeText = result.rawContent;
return {'STATUS':1,'DATA':BarcodeText};
}
catch(e){
return {'STATUS':0,'DATA':e};
}
}
JsonDataPostRaw(Map jsonData, String url,{timeout:false}) async{
const JsonDecoder decoder = const JsonDecoder();
try {
var response;
if (timeout)
response = await http.post(
'$url', headers: {'Content-type': 'application/json'},
body: json.encode(jsonData)).timeout(
const Duration(seconds: 10));
else
response = await http.post(
'$url', headers: {'Content-type': 'application/json'},
body: json.encode(jsonData));
final Map data = decoder.convert(response.body);
return data;
} on TimeoutException catch(e){
return {"STATUS":"ERROR","ERROR":"Request Timeout"};
}
on Exception catch(exception){
print(url);
// Toast("Not Connected to Server", Colors.red);
return {"STATUS":"ERROR","ERROR":"Not Connected to Server. $exception"};
}
}
showToast(type,text)async{
await Fluttertoast.cancel();
Fluttertoast.showToast(
msg: "$text",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
timeInSecForIosWeb: 1,
backgroundColor: (type=='ERROR')?Colors.red:(type=='SUCCESS')?Colors.green:Colors.black38,
textColor: Colors.white,
fontSize: 16.0
);
}
showLoading(context,{dissmissable=false,onwillpop}){
showDialog(
context: context,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: onwillpop??()async{return true;},
child: new Center(
child: new CircularProgressIndicator(),
),
);
},
barrierDismissible: dissmissable,
);
}

checkinternet()async{
try {
var result = await InternetAddress.lookup('google.com').timeout(Duration(seconds: 3),onTimeout: (){return null;});
if (result!=null && result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
return true;
}
else return false;
} on SocketException catch (_) {
return false;
}
}

}

+ 362
- 0
pubspec.lock View File

@@ -0,0 +1,362 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.2"
barcode_scan:
dependency: "direct main"
description:
name: barcode_scan
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.3"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.14.13"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.3"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.1"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "0.10.11"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.8"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
fluttertoast:
dependency: "direct main"
description:
name: fluttertoast
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.1"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.1"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.4"
image_picker:
dependency: "direct main"
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.7+2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
intl:
dependency: transitive
description:
name: intl
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.8"
matrix_gesture_detector:
dependency: "direct main"
description:
name: matrix_gesture_detector
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.8"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.1+1"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4+3"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.0"
photo_view:
dependency: "direct main"
description:
name: photo_view
url: "https://pub.dartlang.org"
source: hosted
version: "0.9.2"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.1"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.13"
protobuf:
dependency: transitive
description:
name: protobuf
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.7+3"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.1+10"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2+7"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
sqflite:
dependency: "direct main"
description:
name: sqflite
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2+1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.5"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
synchronized:
dependency: transitive
description:
name: synchronized
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0+1"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.17"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.8"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0"
sdks:
dart: ">=2.9.0-14.0.dev <3.0.0"
flutter: ">=1.12.13+hotfix.5 <2.0.0"

+ 81
- 0
pubspec.yaml View File

@@ -0,0 +1,81 @@
name: assetstock
description: Application to check assets

# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.4+5

environment:
sdk: ">=2.7.0 <3.0.0"

dependencies:
flutter:
sdk: flutter
image_picker:
barcode_scan:
path_provider:
shared_preferences:
fluttertoast:
photo_view:
sqflite:
matrix_gesture_detector:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.3

dev_dependencies:
flutter_test:
sdk: flutter

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true

# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg

# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.

# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages

# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

+ 30
- 0
test/widget_test.dart View File

@@ -0,0 +1,30 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:assetstock/main.dart';

void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());

// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);

// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();

// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
}

Loading…
Cancel
Save