diff --git a/examples/shop_app_example/.firebaserc b/examples/shop_app_example/shop_app_example/.firebaserc similarity index 100% rename from examples/shop_app_example/.firebaserc rename to examples/shop_app_example/shop_app_example/.firebaserc diff --git a/examples/shop_app_example/.gitignore b/examples/shop_app_example/shop_app_example/.gitignore similarity index 98% rename from examples/shop_app_example/.gitignore rename to examples/shop_app_example/shop_app_example/.gitignore index 1eab1a22..d4848c1e 100644 --- a/examples/shop_app_example/.gitignore +++ b/examples/shop_app_example/shop_app_example/.gitignore @@ -31,7 +31,7 @@ migrate_working_dir/ .pub-cache/ .pub/ /build/ - +pubspec.lock # Web related # Symbolication related diff --git a/examples/shop_app_example/.metadata b/examples/shop_app_example/shop_app_example/.metadata similarity index 100% rename from examples/shop_app_example/.metadata rename to examples/shop_app_example/shop_app_example/.metadata diff --git a/examples/shop_app_example/README.md b/examples/shop_app_example/shop_app_example/README.md similarity index 100% rename from examples/shop_app_example/README.md rename to examples/shop_app_example/shop_app_example/README.md diff --git a/examples/shop_app_example/analysis_options.yaml b/examples/shop_app_example/shop_app_example/analysis_options.yaml similarity index 100% rename from examples/shop_app_example/analysis_options.yaml rename to examples/shop_app_example/shop_app_example/analysis_options.yaml diff --git a/examples/shop_app_example/android/.gitignore b/examples/shop_app_example/shop_app_example/android/.gitignore similarity index 100% rename from examples/shop_app_example/android/.gitignore rename to examples/shop_app_example/shop_app_example/android/.gitignore diff --git a/examples/shop_app_example/shop_app_example/android/app/build.gradle b/examples/shop_app_example/shop_app_example/android/app/build.gradle new file mode 100644 index 00000000..5998d897 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/app/build.gradle @@ -0,0 +1,76 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +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' +} + + + +android { + compileSdkVersion 34 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.shop_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + 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 + } + } + namespace 'com.example.shop_app_example' +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/examples/shop_app_example/shop_app_example/android/app/src/debug/AndroidManifest.xml b/examples/shop_app_example/shop_app_example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/examples/shop_app_example/shop_app_example/android/app/src/main/AndroidManifest.xml b/examples/shop_app_example/shop_app_example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..f9a277ca --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/examples/shop_app_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt b/examples/shop_app_example/shop_app_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt similarity index 100% rename from examples/shop_app_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt rename to examples/shop_app_example/shop_app_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt diff --git a/examples/shop_app_example/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/shop_app_example/shop_app_example/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/drawable-v21/launch_background.xml rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/examples/shop_app_example/android/app/src/main/res/drawable/launch_background.xml b/examples/shop_app_example/shop_app_example/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/drawable/launch_background.xml rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/drawable/launch_background.xml diff --git a/examples/shop_app_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/examples/shop_app_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/examples/shop_app_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/examples/shop_app_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/examples/shop_app_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/examples/shop_app_example/android/app/src/main/res/values-night/styles.xml b/examples/shop_app_example/shop_app_example/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/values-night/styles.xml rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/values-night/styles.xml diff --git a/examples/shop_app_example/android/app/src/main/res/values/styles.xml b/examples/shop_app_example/shop_app_example/android/app/src/main/res/values/styles.xml similarity index 100% rename from examples/shop_app_example/android/app/src/main/res/values/styles.xml rename to examples/shop_app_example/shop_app_example/android/app/src/main/res/values/styles.xml diff --git a/examples/shop_app_example/shop_app_example/android/app/src/profile/AndroidManifest.xml b/examples/shop_app_example/shop_app_example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/examples/shop_app_example/shop_app_example/android/build.gradle b/examples/shop_app_example/shop_app_example/android/build.gradle new file mode 100644 index 00000000..b8fa5823 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.9.20' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.1.4' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/examples/shop_app_example/shop_app_example/android/gradle.properties b/examples/shop_app_example/shop_app_example/android/gradle.properties new file mode 100644 index 00000000..b9a9a246 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/examples/shop_app_example/shop_app_example/android/gradle/wrapper/gradle-wrapper.properties b/examples/shop_app_example/shop_app_example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..8bc9958a --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip diff --git a/examples/shop_app_example/shop_app_example/android/settings.gradle b/examples/shop_app_example/shop_app_example/android/settings.gradle new file mode 100644 index 00000000..45d92d22 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" \ No newline at end of file diff --git a/examples/shop_app_example/assets/air_max_plus.png b/examples/shop_app_example/shop_app_example/assets/air_max_plus.png similarity index 100% rename from examples/shop_app_example/assets/air_max_plus.png rename to examples/shop_app_example/shop_app_example/assets/air_max_plus.png diff --git a/examples/shop_app_example/assets/air_max_plus_white.png b/examples/shop_app_example/shop_app_example/assets/air_max_plus_white.png similarity index 100% rename from examples/shop_app_example/assets/air_max_plus_white.png rename to examples/shop_app_example/shop_app_example/assets/air_max_plus_white.png diff --git a/examples/shop_app_example/assets/black.png b/examples/shop_app_example/shop_app_example/assets/black.png similarity index 100% rename from examples/shop_app_example/assets/black.png rename to examples/shop_app_example/shop_app_example/assets/black.png diff --git a/examples/shop_app_example/assets/blue_shoe.png b/examples/shop_app_example/shop_app_example/assets/blue_shoe.png similarity index 100% rename from examples/shop_app_example/assets/blue_shoe.png rename to examples/shop_app_example/shop_app_example/assets/blue_shoe.png diff --git a/examples/shop_app_example/assets/flutter.png b/examples/shop_app_example/shop_app_example/assets/flutter.png similarity index 100% rename from examples/shop_app_example/assets/flutter.png rename to examples/shop_app_example/shop_app_example/assets/flutter.png diff --git a/examples/shop_app_example/assets/github.png b/examples/shop_app_example/shop_app_example/assets/github.png similarity index 100% rename from examples/shop_app_example/assets/github.png rename to examples/shop_app_example/shop_app_example/assets/github.png diff --git a/examples/shop_app_example/assets/iphone_mockup.png b/examples/shop_app_example/shop_app_example/assets/iphone_mockup.png similarity index 100% rename from examples/shop_app_example/assets/iphone_mockup.png rename to examples/shop_app_example/shop_app_example/assets/iphone_mockup.png diff --git a/examples/shop_app_example/assets/red_shoe.png b/examples/shop_app_example/shop_app_example/assets/red_shoe.png similarity index 100% rename from examples/shop_app_example/assets/red_shoe.png rename to examples/shop_app_example/shop_app_example/assets/red_shoe.png diff --git a/examples/shop_app_example/devtools_options.yaml b/examples/shop_app_example/shop_app_example/devtools_options.yaml similarity index 100% rename from examples/shop_app_example/devtools_options.yaml rename to examples/shop_app_example/shop_app_example/devtools_options.yaml diff --git a/examples/shop_app_example/firebase.json b/examples/shop_app_example/shop_app_example/firebase.json similarity index 100% rename from examples/shop_app_example/firebase.json rename to examples/shop_app_example/shop_app_example/firebase.json diff --git a/examples/shop_app_example/ios/.gitignore b/examples/shop_app_example/shop_app_example/ios/.gitignore similarity index 100% rename from examples/shop_app_example/ios/.gitignore rename to examples/shop_app_example/shop_app_example/ios/.gitignore diff --git a/examples/shop_app_example/ios/Flutter/AppFrameworkInfo.plist b/examples/shop_app_example/shop_app_example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from examples/shop_app_example/ios/Flutter/AppFrameworkInfo.plist rename to examples/shop_app_example/shop_app_example/ios/Flutter/AppFrameworkInfo.plist diff --git a/examples/shop_app_example/ios/Flutter/Debug.xcconfig b/examples/shop_app_example/shop_app_example/ios/Flutter/Debug.xcconfig similarity index 100% rename from examples/shop_app_example/ios/Flutter/Debug.xcconfig rename to examples/shop_app_example/shop_app_example/ios/Flutter/Debug.xcconfig diff --git a/examples/shop_app_example/ios/Flutter/Release.xcconfig b/examples/shop_app_example/shop_app_example/ios/Flutter/Release.xcconfig similarity index 100% rename from examples/shop_app_example/ios/Flutter/Release.xcconfig rename to examples/shop_app_example/shop_app_example/ios/Flutter/Release.xcconfig diff --git a/examples/shop_app_example/ios/Podfile b/examples/shop_app_example/shop_app_example/ios/Podfile similarity index 100% rename from examples/shop_app_example/ios/Podfile rename to examples/shop_app_example/shop_app_example/ios/Podfile diff --git a/examples/shop_app_example/shop_app_example/ios/Podfile.lock b/examples/shop_app_example/shop_app_example/ios/Podfile.lock new file mode 100644 index 00000000..ff7596b0 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/ios/Podfile.lock @@ -0,0 +1,161 @@ +PODS: + - Firebase/Analytics (10.25.0): + - Firebase/Core + - Firebase/Core (10.25.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.25.0) + - Firebase/CoreOnly (10.25.0): + - FirebaseCore (= 10.25.0) + - firebase_analytics (10.10.7): + - Firebase/Analytics (= 10.25.0) + - firebase_core + - Flutter + - firebase_core (2.32.0): + - Firebase/CoreOnly (= 10.25.0) + - Flutter + - FirebaseAnalytics (10.25.0): + - FirebaseAnalytics/AdIdSupport (= 10.25.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.25.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.25.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseCore (10.25.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreInternal (10.29.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.29.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - Flutter (1.0.0) + - GoogleAppMeasurement (10.25.0): + - GoogleAppMeasurement/AdIdSupport (= 10.25.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.25.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.25.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.25.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Privacy + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.13.3)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.3) + - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - nanopb (2.30910.0): + - nanopb/decode (= 2.30910.0) + - nanopb/encode (= 2.30910.0) + - nanopb/decode (2.30910.0) + - nanopb/encode (2.30910.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - share_plus (0.0.1): + - Flutter + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - Flutter (from `Flutter`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - GoogleAppMeasurement + - GoogleUtilities + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + Flutter: + :path: Flutter + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + Firebase: 0312a2352584f782ea56f66d91606891d4607f06 + firebase_analytics: cc06e24d6a2343c44f845b3112143db72d10ef78 + firebase_core: a626d00494efa398e7c54f25f1454a64c8abf197 + FirebaseAnalytics: ec00fe8b93b41dc6fe4a28784b8e51da0647a248 + FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483 + FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 + FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + GoogleAppMeasurement: 9abf64b682732fed36da827aa2a68f0221fd2356 + GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + nanopb: 438bc412db1928dac798aa6fd75726007be04262 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + +PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 + +COCOAPODS: 1.15.2 diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.pbxproj b/examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/project.pbxproj rename to examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.pbxproj diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to examples/shop_app_example/shop_app_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to examples/shop_app_example/shop_app_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/shop_app_example/shop_app_example/ios/Runner/AppDelegate.swift b/examples/shop_app_example/shop_app_example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..b6363034 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@main +@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) + } +} diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from examples/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to examples/shop_app_example/shop_app_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/examples/shop_app_example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/shop_app_example/shop_app_example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from examples/shop_app_example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to examples/shop_app_example/shop_app_example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/examples/shop_app_example/ios/Runner/Base.lproj/Main.storyboard b/examples/shop_app_example/shop_app_example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from examples/shop_app_example/ios/Runner/Base.lproj/Main.storyboard rename to examples/shop_app_example/shop_app_example/ios/Runner/Base.lproj/Main.storyboard diff --git a/examples/shop_app_example/ios/Runner/Info.plist b/examples/shop_app_example/shop_app_example/ios/Runner/Info.plist similarity index 100% rename from examples/shop_app_example/ios/Runner/Info.plist rename to examples/shop_app_example/shop_app_example/ios/Runner/Info.plist diff --git a/examples/shop_app_example/ios/Runner/Runner-Bridging-Header.h b/examples/shop_app_example/shop_app_example/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from examples/shop_app_example/ios/Runner/Runner-Bridging-Header.h rename to examples/shop_app_example/shop_app_example/ios/Runner/Runner-Bridging-Header.h diff --git a/examples/shop_app_example/lib/features/product/bloc/bloc.dart b/examples/shop_app_example/shop_app_example/lib/features/product/bloc/bloc.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/bloc/bloc.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/bloc/bloc.dart diff --git a/examples/shop_app_example/lib/features/product/bloc/product/product_bloc.dart b/examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_bloc.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/bloc/product/product_bloc.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_bloc.dart diff --git a/examples/shop_app_example/lib/features/product/bloc/product/product_event.dart b/examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_event.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/bloc/product/product_event.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_event.dart diff --git a/examples/shop_app_example/lib/features/product/bloc/product/product_state.dart b/examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_state.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/bloc/product/product_state.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/bloc/product/product_state.dart diff --git a/examples/shop_app_example/lib/features/product/product.dart b/examples/shop_app_example/shop_app_example/lib/features/product/product.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/product.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/product.dart diff --git a/examples/shop_app_example/lib/features/product/view/product_screen.dart b/examples/shop_app_example/shop_app_example/lib/features/product/view/product_screen.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/view/product_screen.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/view/product_screen.dart diff --git a/examples/shop_app_example/lib/features/product/view/view.dart b/examples/shop_app_example/shop_app_example/lib/features/product/view/view.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/view/view.dart rename to examples/shop_app_example/shop_app_example/lib/features/product/view/view.dart diff --git a/examples/shop_app_example/lib/features/products/bloc/bloc.dart b/examples/shop_app_example/shop_app_example/lib/features/products/bloc/bloc.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/bloc/bloc.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/bloc/bloc.dart diff --git a/examples/shop_app_example/lib/features/products/bloc/products/products_bloc.dart b/examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_bloc.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/bloc/products/products_bloc.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_bloc.dart diff --git a/examples/shop_app_example/lib/features/products/bloc/products/products_event.dart b/examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_event.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/bloc/products/products_event.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_event.dart diff --git a/examples/shop_app_example/lib/features/products/bloc/products/products_state.dart b/examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_state.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/bloc/products/products_state.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/bloc/products/products_state.dart diff --git a/examples/shop_app_example/lib/features/products/products.dart b/examples/shop_app_example/shop_app_example/lib/features/products/products.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/products.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/products.dart diff --git a/examples/shop_app_example/lib/features/products/view/products_screen.dart b/examples/shop_app_example/shop_app_example/lib/features/products/view/products_screen.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/view/products_screen.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/view/products_screen.dart diff --git a/examples/shop_app_example/lib/features/products/view/view.dart b/examples/shop_app_example/shop_app_example/lib/features/products/view/view.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/view/view.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/view/view.dart diff --git a/examples/shop_app_example/lib/features/products/widgets/product_card.dart b/examples/shop_app_example/shop_app_example/lib/features/products/widgets/product_card.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/widgets/product_card.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/widgets/product_card.dart diff --git a/examples/shop_app_example/lib/features/products/widgets/widgets.dart b/examples/shop_app_example/shop_app_example/lib/features/products/widgets/widgets.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/widgets/widgets.dart rename to examples/shop_app_example/shop_app_example/lib/features/products/widgets/widgets.dart diff --git a/examples/shop_app_example/lib/firebase_options.dart b/examples/shop_app_example/shop_app_example/lib/firebase_options.dart similarity index 100% rename from examples/shop_app_example/lib/firebase_options.dart rename to examples/shop_app_example/shop_app_example/lib/firebase_options.dart diff --git a/examples/shop_app_example/lib/main.dart b/examples/shop_app_example/shop_app_example/lib/main.dart similarity index 92% rename from examples/shop_app_example/lib/main.dart rename to examples/shop_app_example/shop_app_example/lib/main.dart index 5166a4a1..d4e4f7de 100644 --- a/examples/shop_app_example/lib/main.dart +++ b/examples/shop_app_example/shop_app_example/lib/main.dart @@ -12,6 +12,7 @@ import 'package:talker_flutter/talker_flutter.dart'; import 'package:talker_shop_app_example/repositories/products/products.dart'; import 'package:talker_shop_app_example/ui/presentation_frame.dart'; import 'package:talker_shop_app_example/ui/ui.dart'; +import 'package:talker_shop_app_example/utils/good_log.dart'; import 'package:talker_shop_app_example/utils/scroll_behavior.dart'; import 'package:talker_shop_app_example/utils/utils.dart'; @@ -32,7 +33,8 @@ void _initDependencies() { final talker = TalkerFlutter.init( settings: TalkerSettings( colors: { - TalkerLogType.verbose: AnsiPen()..yellow(), + TalkerLogType.verbose.key: AnsiPen()..yellow(), + GoodLog.getKey: GoodLog.getPen, }, ), ); @@ -55,7 +57,7 @@ void _initDependencies() { DI.registerSingleton( ProductsRepository(dio: dio), ); - talker.info('Repositories initialization completed'); + talker.logCustom(GoodLog('Repositories initialization completed')); Bloc.observer = TalkerBlocObserver( talker: talker, diff --git a/examples/shop_app_example/lib/repositories/products/abstarct_products_repository.dart b/examples/shop_app_example/shop_app_example/lib/repositories/products/abstarct_products_repository.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/abstarct_products_repository.dart rename to examples/shop_app_example/shop_app_example/lib/repositories/products/abstarct_products_repository.dart diff --git a/examples/shop_app_example/lib/repositories/products/models/models.dart b/examples/shop_app_example/shop_app_example/lib/repositories/products/models/models.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/models/models.dart rename to examples/shop_app_example/shop_app_example/lib/repositories/products/models/models.dart diff --git a/examples/shop_app_example/lib/repositories/products/models/product.dart b/examples/shop_app_example/shop_app_example/lib/repositories/products/models/product.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/models/product.dart rename to examples/shop_app_example/shop_app_example/lib/repositories/products/models/product.dart diff --git a/examples/shop_app_example/lib/repositories/products/products.dart b/examples/shop_app_example/shop_app_example/lib/repositories/products/products.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/products.dart rename to examples/shop_app_example/shop_app_example/lib/repositories/products/products.dart diff --git a/examples/shop_app_example/lib/repositories/products/products_repository.dart b/examples/shop_app_example/shop_app_example/lib/repositories/products/products_repository.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/products_repository.dart rename to examples/shop_app_example/shop_app_example/lib/repositories/products/products_repository.dart diff --git a/examples/shop_app_example/lib/ui/presentation_frame.dart b/examples/shop_app_example/shop_app_example/lib/ui/presentation_frame.dart similarity index 100% rename from examples/shop_app_example/lib/ui/presentation_frame.dart rename to examples/shop_app_example/shop_app_example/lib/ui/presentation_frame.dart diff --git a/examples/shop_app_example/lib/ui/presentation_widget.dart b/examples/shop_app_example/shop_app_example/lib/ui/presentation_widget.dart similarity index 100% rename from examples/shop_app_example/lib/ui/presentation_widget.dart rename to examples/shop_app_example/shop_app_example/lib/ui/presentation_widget.dart diff --git a/examples/shop_app_example/lib/ui/router.dart b/examples/shop_app_example/shop_app_example/lib/ui/router.dart similarity index 100% rename from examples/shop_app_example/lib/ui/router.dart rename to examples/shop_app_example/shop_app_example/lib/ui/router.dart diff --git a/examples/shop_app_example/shop_app_example/lib/ui/theme.dart b/examples/shop_app_example/shop_app_example/lib/ui/theme.dart new file mode 100644 index 00000000..f77341c6 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/lib/ui/theme.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/utils/good_log.dart'; + +final lightTheme = ThemeData( + primaryColor: primaryColor, + primarySwatch: primaryColor, + scaffoldBackgroundColor: const Color(0xffF9F9F9), + cardColor: Colors.white, + appBarTheme: const AppBarTheme(color: Colors.white), +); + +const cardShadow = [ + BoxShadow( + color: Color(0x11272749), + blurRadius: 16, + offset: Offset(0, 3), + spreadRadius: 0, + ) +]; + +MaterialColor get primaryColor => MaterialColor( + _primaryColor.value, + _primaryColorCodes, + ); + +Color get _primaryColor => Colors.deepPurple; +final Map _primaryColorCodes = { + 50: _primaryColor.withOpacity(.1), + 100: _primaryColor.withOpacity(.2), + 200: _primaryColor.withOpacity(.3), + 300: _primaryColor.withOpacity(.4), + 400: _primaryColor.withOpacity(.5), + 500: _primaryColor.withOpacity(.6), + 600: _primaryColor.withOpacity(.7), + 700: _primaryColor.withOpacity(.8), + 800: _primaryColor.withOpacity(.9), + 900: _primaryColor, +}; + +final talkerTheme = TalkerScreenTheme(logColors: { + GoodLog.getKey: const Color(0xff4CAF50), +}); diff --git a/examples/shop_app_example/lib/ui/ui.dart b/examples/shop_app_example/shop_app_example/lib/ui/ui.dart similarity index 100% rename from examples/shop_app_example/lib/ui/ui.dart rename to examples/shop_app_example/shop_app_example/lib/ui/ui.dart diff --git a/examples/shop_app_example/lib/utils/di.dart b/examples/shop_app_example/shop_app_example/lib/utils/di.dart similarity index 100% rename from examples/shop_app_example/lib/utils/di.dart rename to examples/shop_app_example/shop_app_example/lib/utils/di.dart diff --git a/examples/shop_app_example/shop_app_example/lib/utils/good_log.dart b/examples/shop_app_example/shop_app_example/lib/utils/good_log.dart new file mode 100644 index 00000000..ec08e48c --- /dev/null +++ b/examples/shop_app_example/shop_app_example/lib/utils/good_log.dart @@ -0,0 +1,22 @@ +import 'package:talker_flutter/talker_flutter.dart'; + +/// `GoodLog` - This class contains the basic structure of the log. +class GoodLog extends TalkerLog { + GoodLog(String super.message); + + /// Log title + @override + String get title => 'good'; + + /// Log key + @override + String get key => getKey; + + /// Log color + @override + AnsiPen get pen => getPen; + + static get getPen => AnsiPen()..xterm(121); + + static get getKey => 'good'; +} diff --git a/examples/shop_app_example/lib/utils/scroll_behavior.dart b/examples/shop_app_example/shop_app_example/lib/utils/scroll_behavior.dart similarity index 100% rename from examples/shop_app_example/lib/utils/scroll_behavior.dart rename to examples/shop_app_example/shop_app_example/lib/utils/scroll_behavior.dart diff --git a/examples/shop_app_example/lib/utils/utils.dart b/examples/shop_app_example/shop_app_example/lib/utils/utils.dart similarity index 100% rename from examples/shop_app_example/lib/utils/utils.dart rename to examples/shop_app_example/shop_app_example/lib/utils/utils.dart diff --git a/examples/shop_app_example/linux/.gitignore b/examples/shop_app_example/shop_app_example/linux/.gitignore similarity index 100% rename from examples/shop_app_example/linux/.gitignore rename to examples/shop_app_example/shop_app_example/linux/.gitignore diff --git a/examples/shop_app_example/linux/CMakeLists.txt b/examples/shop_app_example/shop_app_example/linux/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/linux/CMakeLists.txt rename to examples/shop_app_example/shop_app_example/linux/CMakeLists.txt diff --git a/examples/shop_app_example/linux/flutter/CMakeLists.txt b/examples/shop_app_example/shop_app_example/linux/flutter/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/linux/flutter/CMakeLists.txt rename to examples/shop_app_example/shop_app_example/linux/flutter/CMakeLists.txt diff --git a/examples/shop_app_example/linux/flutter/generated_plugin_registrant.cc b/examples/shop_app_example/shop_app_example/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from examples/shop_app_example/linux/flutter/generated_plugin_registrant.cc rename to examples/shop_app_example/shop_app_example/linux/flutter/generated_plugin_registrant.cc diff --git a/examples/shop_app_example/linux/flutter/generated_plugin_registrant.h b/examples/shop_app_example/shop_app_example/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from examples/shop_app_example/linux/flutter/generated_plugin_registrant.h rename to examples/shop_app_example/shop_app_example/linux/flutter/generated_plugin_registrant.h diff --git a/examples/shop_app_example/linux/flutter/generated_plugins.cmake b/examples/shop_app_example/shop_app_example/linux/flutter/generated_plugins.cmake similarity index 100% rename from examples/shop_app_example/linux/flutter/generated_plugins.cmake rename to examples/shop_app_example/shop_app_example/linux/flutter/generated_plugins.cmake diff --git a/examples/shop_app_example/linux/main.cc b/examples/shop_app_example/shop_app_example/linux/main.cc similarity index 100% rename from examples/shop_app_example/linux/main.cc rename to examples/shop_app_example/shop_app_example/linux/main.cc diff --git a/examples/shop_app_example/linux/my_application.cc b/examples/shop_app_example/shop_app_example/linux/my_application.cc similarity index 100% rename from examples/shop_app_example/linux/my_application.cc rename to examples/shop_app_example/shop_app_example/linux/my_application.cc diff --git a/examples/shop_app_example/linux/my_application.h b/examples/shop_app_example/shop_app_example/linux/my_application.h similarity index 100% rename from examples/shop_app_example/linux/my_application.h rename to examples/shop_app_example/shop_app_example/linux/my_application.h diff --git a/examples/shop_app_example/macos/.gitignore b/examples/shop_app_example/shop_app_example/macos/.gitignore similarity index 100% rename from examples/shop_app_example/macos/.gitignore rename to examples/shop_app_example/shop_app_example/macos/.gitignore diff --git a/examples/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig b/examples/shop_app_example/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig diff --git a/examples/shop_app_example/macos/Flutter/Flutter-Release.xcconfig b/examples/shop_app_example/shop_app_example/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Flutter/Flutter-Release.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Flutter/Flutter-Release.xcconfig diff --git a/examples/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/shop_app_example/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from examples/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift rename to examples/shop_app_example/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/examples/shop_app_example/macos/Podfile b/examples/shop_app_example/shop_app_example/macos/Podfile similarity index 100% rename from examples/shop_app_example/macos/Podfile rename to examples/shop_app_example/shop_app_example/macos/Podfile diff --git a/examples/shop_app_example/macos/Podfile.lock b/examples/shop_app_example/shop_app_example/macos/Podfile.lock similarity index 100% rename from examples/shop_app_example/macos/Podfile.lock rename to examples/shop_app_example/shop_app_example/macos/Podfile.lock diff --git a/examples/shop_app_example/macos/Runner.xcodeproj/project.pbxproj b/examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/shop_app_example/macos/Runner.xcodeproj/project.pbxproj rename to examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/project.pbxproj diff --git a/examples/shop_app_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/shop_app_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from examples/shop_app_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to examples/shop_app_example/shop_app_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app_example/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata rename to examples/shop_app_example/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/shop_app_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_example/shop_app_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from examples/shop_app_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to examples/shop_app_example/shop_app_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/macos/Runner/AppDelegate.swift b/examples/shop_app_example/shop_app_example/macos/Runner/AppDelegate.swift similarity index 100% rename from examples/shop_app_example/macos/Runner/AppDelegate.swift rename to examples/shop_app_example/shop_app_example/macos/Runner/AppDelegate.swift diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to examples/shop_app_example/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/examples/shop_app_example/macos/Runner/Base.lproj/MainMenu.xib b/examples/shop_app_example/shop_app_example/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from examples/shop_app_example/macos/Runner/Base.lproj/MainMenu.xib rename to examples/shop_app_example/shop_app_example/macos/Runner/Base.lproj/MainMenu.xib diff --git a/examples/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig b/examples/shop_app_example/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Debug.xcconfig b/examples/shop_app_example/shop_app_example/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Debug.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Runner/Configs/Debug.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Release.xcconfig b/examples/shop_app_example/shop_app_example/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Release.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Runner/Configs/Release.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Warnings.xcconfig b/examples/shop_app_example/shop_app_example/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Warnings.xcconfig rename to examples/shop_app_example/shop_app_example/macos/Runner/Configs/Warnings.xcconfig diff --git a/examples/shop_app_example/macos/Runner/DebugProfile.entitlements b/examples/shop_app_example/shop_app_example/macos/Runner/DebugProfile.entitlements similarity index 100% rename from examples/shop_app_example/macos/Runner/DebugProfile.entitlements rename to examples/shop_app_example/shop_app_example/macos/Runner/DebugProfile.entitlements diff --git a/examples/shop_app_example/macos/Runner/Info.plist b/examples/shop_app_example/shop_app_example/macos/Runner/Info.plist similarity index 100% rename from examples/shop_app_example/macos/Runner/Info.plist rename to examples/shop_app_example/shop_app_example/macos/Runner/Info.plist diff --git a/examples/shop_app_example/macos/Runner/MainFlutterWindow.swift b/examples/shop_app_example/shop_app_example/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from examples/shop_app_example/macos/Runner/MainFlutterWindow.swift rename to examples/shop_app_example/shop_app_example/macos/Runner/MainFlutterWindow.swift diff --git a/examples/shop_app_example/macos/Runner/Release.entitlements b/examples/shop_app_example/shop_app_example/macos/Runner/Release.entitlements similarity index 100% rename from examples/shop_app_example/macos/Runner/Release.entitlements rename to examples/shop_app_example/shop_app_example/macos/Runner/Release.entitlements diff --git a/examples/shop_app_example/shop_app_example/pubspec.yaml b/examples/shop_app_example/shop_app_example/pubspec.yaml new file mode 100644 index 00000000..5ac2aed3 --- /dev/null +++ b/examples/shop_app_example/shop_app_example/pubspec.yaml @@ -0,0 +1,32 @@ +name: talker_shop_app_example +description: Talker flutter example shop application +publish_to: "none" +version: 1.0.0+1 + +environment: + sdk: '>=2.17.1 <4.0.0' +dependencies: + flutter: + sdk: flutter + + talker_flutter: ^4.5.1 + talker_dio_logger: ^4.5.1 + talker_bloc_logger: ^4.5.1 + + get_it: ^7.6.7 + flutter_bloc: ^8.1.3 + equatable: ^2.0.5 + dio: ^5.4.0 + url_launcher: ^6.3.1 + firebase_core: ^2.24.2 + firebase_analytics: ^10.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.1 + +flutter: + uses-material-design: true + assets: + - assets/ diff --git a/examples/shop_app_example/pubspec_overrides.yaml b/examples/shop_app_example/shop_app_example/pubspec_overrides.yaml similarity index 100% rename from examples/shop_app_example/pubspec_overrides.yaml rename to examples/shop_app_example/shop_app_example/pubspec_overrides.yaml diff --git a/examples/shop_app_example/web/favicon.png b/examples/shop_app_example/shop_app_example/web/favicon.png similarity index 100% rename from examples/shop_app_example/web/favicon.png rename to examples/shop_app_example/shop_app_example/web/favicon.png diff --git a/examples/shop_app_example/web/icons/Icon-192.png b/examples/shop_app_example/shop_app_example/web/icons/Icon-192.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-192.png rename to examples/shop_app_example/shop_app_example/web/icons/Icon-192.png diff --git a/examples/shop_app_example/web/icons/Icon-512.png b/examples/shop_app_example/shop_app_example/web/icons/Icon-512.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-512.png rename to examples/shop_app_example/shop_app_example/web/icons/Icon-512.png diff --git a/examples/shop_app_example/web/icons/Icon-maskable-192.png b/examples/shop_app_example/shop_app_example/web/icons/Icon-maskable-192.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-maskable-192.png rename to examples/shop_app_example/shop_app_example/web/icons/Icon-maskable-192.png diff --git a/examples/shop_app_example/web/icons/Icon-maskable-512.png b/examples/shop_app_example/shop_app_example/web/icons/Icon-maskable-512.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-maskable-512.png rename to examples/shop_app_example/shop_app_example/web/icons/Icon-maskable-512.png diff --git a/examples/shop_app_example/web/index.html b/examples/shop_app_example/shop_app_example/web/index.html similarity index 100% rename from examples/shop_app_example/web/index.html rename to examples/shop_app_example/shop_app_example/web/index.html diff --git a/examples/shop_app_example/web/manifest.json b/examples/shop_app_example/shop_app_example/web/manifest.json similarity index 100% rename from examples/shop_app_example/web/manifest.json rename to examples/shop_app_example/shop_app_example/web/manifest.json diff --git a/examples/shop_app_example/windows/.gitignore b/examples/shop_app_example/shop_app_example/windows/.gitignore similarity index 100% rename from examples/shop_app_example/windows/.gitignore rename to examples/shop_app_example/shop_app_example/windows/.gitignore diff --git a/examples/shop_app_example/windows/CMakeLists.txt b/examples/shop_app_example/shop_app_example/windows/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/CMakeLists.txt rename to examples/shop_app_example/shop_app_example/windows/CMakeLists.txt diff --git a/examples/shop_app_example/windows/flutter/CMakeLists.txt b/examples/shop_app_example/shop_app_example/windows/flutter/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/flutter/CMakeLists.txt rename to examples/shop_app_example/shop_app_example/windows/flutter/CMakeLists.txt diff --git a/examples/shop_app_example/windows/flutter/generated_plugin_registrant.cc b/examples/shop_app_example/shop_app_example/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from examples/shop_app_example/windows/flutter/generated_plugin_registrant.cc rename to examples/shop_app_example/shop_app_example/windows/flutter/generated_plugin_registrant.cc diff --git a/examples/shop_app_example/windows/flutter/generated_plugin_registrant.h b/examples/shop_app_example/shop_app_example/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from examples/shop_app_example/windows/flutter/generated_plugin_registrant.h rename to examples/shop_app_example/shop_app_example/windows/flutter/generated_plugin_registrant.h diff --git a/examples/shop_app_example/windows/flutter/generated_plugins.cmake b/examples/shop_app_example/shop_app_example/windows/flutter/generated_plugins.cmake similarity index 100% rename from examples/shop_app_example/windows/flutter/generated_plugins.cmake rename to examples/shop_app_example/shop_app_example/windows/flutter/generated_plugins.cmake diff --git a/examples/shop_app_example/windows/runner/CMakeLists.txt b/examples/shop_app_example/shop_app_example/windows/runner/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/runner/CMakeLists.txt rename to examples/shop_app_example/shop_app_example/windows/runner/CMakeLists.txt diff --git a/examples/shop_app_example/windows/runner/Runner.rc b/examples/shop_app_example/shop_app_example/windows/runner/Runner.rc similarity index 100% rename from examples/shop_app_example/windows/runner/Runner.rc rename to examples/shop_app_example/shop_app_example/windows/runner/Runner.rc diff --git a/examples/shop_app_example/windows/runner/flutter_window.cpp b/examples/shop_app_example/shop_app_example/windows/runner/flutter_window.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/flutter_window.cpp rename to examples/shop_app_example/shop_app_example/windows/runner/flutter_window.cpp diff --git a/examples/shop_app_example/windows/runner/flutter_window.h b/examples/shop_app_example/shop_app_example/windows/runner/flutter_window.h similarity index 100% rename from examples/shop_app_example/windows/runner/flutter_window.h rename to examples/shop_app_example/shop_app_example/windows/runner/flutter_window.h diff --git a/examples/shop_app_example/windows/runner/main.cpp b/examples/shop_app_example/shop_app_example/windows/runner/main.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/main.cpp rename to examples/shop_app_example/shop_app_example/windows/runner/main.cpp diff --git a/examples/shop_app_example/windows/runner/resource.h b/examples/shop_app_example/shop_app_example/windows/runner/resource.h similarity index 100% rename from examples/shop_app_example/windows/runner/resource.h rename to examples/shop_app_example/shop_app_example/windows/runner/resource.h diff --git a/examples/shop_app_example/windows/runner/resources/app_icon.ico b/examples/shop_app_example/shop_app_example/windows/runner/resources/app_icon.ico similarity index 100% rename from examples/shop_app_example/windows/runner/resources/app_icon.ico rename to examples/shop_app_example/shop_app_example/windows/runner/resources/app_icon.ico diff --git a/examples/shop_app_example/windows/runner/runner.exe.manifest b/examples/shop_app_example/shop_app_example/windows/runner/runner.exe.manifest similarity index 100% rename from examples/shop_app_example/windows/runner/runner.exe.manifest rename to examples/shop_app_example/shop_app_example/windows/runner/runner.exe.manifest diff --git a/examples/shop_app_example/windows/runner/utils.cpp b/examples/shop_app_example/shop_app_example/windows/runner/utils.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/utils.cpp rename to examples/shop_app_example/shop_app_example/windows/runner/utils.cpp diff --git a/examples/shop_app_example/windows/runner/utils.h b/examples/shop_app_example/shop_app_example/windows/runner/utils.h similarity index 100% rename from examples/shop_app_example/windows/runner/utils.h rename to examples/shop_app_example/shop_app_example/windows/runner/utils.h diff --git a/examples/shop_app_example/windows/runner/win32_window.cpp b/examples/shop_app_example/shop_app_example/windows/runner/win32_window.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/win32_window.cpp rename to examples/shop_app_example/shop_app_example/windows/runner/win32_window.cpp diff --git a/examples/shop_app_example/windows/runner/win32_window.h b/examples/shop_app_example/shop_app_example/windows/runner/win32_window.h similarity index 100% rename from examples/shop_app_example/windows/runner/win32_window.h rename to examples/shop_app_example/shop_app_example/windows/runner/win32_window.h diff --git a/examples/shop_app_with_local_database_example/.firebaserc b/examples/shop_app_with_local_database_example/.firebaserc new file mode 100644 index 00000000..7b21a1c5 --- /dev/null +++ b/examples/shop_app_with_local_database_example/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "talker-7ac5e" + } +} diff --git a/examples/shop_app_with_local_database_example/.fvmrc b/examples/shop_app_with_local_database_example/.fvmrc new file mode 100644 index 00000000..7c3d0b51 --- /dev/null +++ b/examples/shop_app_with_local_database_example/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.22.0" +} \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/.gitignore b/examples/shop_app_with_local_database_example/.gitignore new file mode 100644 index 00000000..4741c6ae --- /dev/null +++ b/examples/shop_app_with_local_database_example/.gitignore @@ -0,0 +1,49 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.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/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/.metadata b/examples/shop_app_with_local_database_example/.metadata new file mode 100644 index 00000000..9e70ade3 --- /dev/null +++ b/examples/shop_app_with_local_database_example/.metadata @@ -0,0 +1,45 @@ +# 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. + +version: + revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: android + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: ios + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: linux + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: macos + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: web + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + - platform: windows + create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/examples/shop_app_with_local_database_example/.vscode/settings.json b/examples/shop_app_with_local_database_example/.vscode/settings.json new file mode 100644 index 00000000..cfd20b7b --- /dev/null +++ b/examples/shop_app_with_local_database_example/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dart.flutterSdkPath": ".fvm/versions/3.22.0" +} \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/README.md b/examples/shop_app_with_local_database_example/README.md new file mode 100644 index 00000000..63efe187 --- /dev/null +++ b/examples/shop_app_with_local_database_example/README.md @@ -0,0 +1,16 @@ +# talker_shop_app_example + +A new Flutter project. + +## 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://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/examples/shop_app_with_local_database_example/analysis_options.yaml b/examples/shop_app_with_local_database_example/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/examples/shop_app_with_local_database_example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/examples/shop_app_with_local_database_example/android/.gitignore b/examples/shop_app_with_local_database_example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/examples/shop_app_with_local_database_example/android/app/build.gradle b/examples/shop_app_with_local_database_example/android/app/build.gradle new file mode 100644 index 00000000..5998d897 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/build.gradle @@ -0,0 +1,76 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +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' +} + + + +android { + compileSdkVersion 34 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.shop_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + 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 + } + } + namespace 'com.example.shop_app_example' +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/examples/shop_app_with_local_database_example/android/app/src/debug/AndroidManifest.xml b/examples/shop_app_with_local_database_example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/AndroidManifest.xml b/examples/shop_app_with_local_database_example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..f9a277ca --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt b/examples/shop_app_with_local_database_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt new file mode 100644 index 00000000..2a8b53de --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.shop_app_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable/launch_background.xml b/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 00000000..db77bb4b Binary files /dev/null and b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 00000000..17987b79 Binary files /dev/null and b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 00000000..09d43914 Binary files /dev/null and b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 00000000..d5f1c8d3 Binary files /dev/null and b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..4d6372ee Binary files /dev/null and b/examples/shop_app_with_local_database_example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/values-night/styles.xml b/examples/shop_app_with_local_database_example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/main/res/values/styles.xml b/examples/shop_app_with_local_database_example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/examples/shop_app_with_local_database_example/android/app/src/profile/AndroidManifest.xml b/examples/shop_app_with_local_database_example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/examples/shop_app_with_local_database_example/android/build.gradle b/examples/shop_app_with_local_database_example/android/build.gradle new file mode 100644 index 00000000..b8fa5823 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.9.20' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:8.1.4' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/examples/shop_app_with_local_database_example/android/gradle.properties b/examples/shop_app_with_local_database_example/android/gradle.properties new file mode 100644 index 00000000..b9a9a246 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/examples/shop_app_with_local_database_example/android/gradle/wrapper/gradle-wrapper.properties b/examples/shop_app_with_local_database_example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..8bc9958a --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip diff --git a/examples/shop_app_with_local_database_example/android/settings.gradle b/examples/shop_app_with_local_database_example/android/settings.gradle new file mode 100644 index 00000000..45d92d22 --- /dev/null +++ b/examples/shop_app_with_local_database_example/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/assets/air_max_plus.png b/examples/shop_app_with_local_database_example/assets/air_max_plus.png new file mode 100644 index 00000000..8e749143 Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/air_max_plus.png differ diff --git a/examples/shop_app_with_local_database_example/assets/air_max_plus_white.png b/examples/shop_app_with_local_database_example/assets/air_max_plus_white.png new file mode 100644 index 00000000..63cb52a5 Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/air_max_plus_white.png differ diff --git a/examples/shop_app_with_local_database_example/assets/black.png b/examples/shop_app_with_local_database_example/assets/black.png new file mode 100644 index 00000000..6a60b6e4 Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/black.png differ diff --git a/examples/shop_app_with_local_database_example/assets/blue_shoe.png b/examples/shop_app_with_local_database_example/assets/blue_shoe.png new file mode 100644 index 00000000..f3e8d03d Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/blue_shoe.png differ diff --git a/examples/shop_app_with_local_database_example/assets/flutter.png b/examples/shop_app_with_local_database_example/assets/flutter.png new file mode 100644 index 00000000..c9c7f716 Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/flutter.png differ diff --git a/examples/shop_app_with_local_database_example/assets/github.png b/examples/shop_app_with_local_database_example/assets/github.png new file mode 100644 index 00000000..4264efdd Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/github.png differ diff --git a/examples/shop_app_with_local_database_example/assets/iphone_mockup.png b/examples/shop_app_with_local_database_example/assets/iphone_mockup.png new file mode 100644 index 00000000..a0ff5c7c Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/iphone_mockup.png differ diff --git a/examples/shop_app_with_local_database_example/assets/red_shoe.png b/examples/shop_app_with_local_database_example/assets/red_shoe.png new file mode 100644 index 00000000..c975bf52 Binary files /dev/null and b/examples/shop_app_with_local_database_example/assets/red_shoe.png differ diff --git a/examples/shop_app_with_local_database_example/devtools_options.yaml b/examples/shop_app_with_local_database_example/devtools_options.yaml new file mode 100644 index 00000000..7e7e7f67 --- /dev/null +++ b/examples/shop_app_with_local_database_example/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/examples/shop_app_with_local_database_example/firebase.json b/examples/shop_app_with_local_database_example/firebase.json new file mode 100644 index 00000000..66037326 --- /dev/null +++ b/examples/shop_app_with_local_database_example/firebase.json @@ -0,0 +1,16 @@ +{ + "hosting": { + "public": "build/web", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/examples/shop_app_with_local_database_example/ios/.gitignore b/examples/shop_app_with_local_database_example/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.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/ephemeral/ +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 diff --git a/examples/shop_app_with_local_database_example/ios/Flutter/AppFrameworkInfo.plist b/examples/shop_app_with_local_database_example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..7c569640 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/examples/shop_app_with_local_database_example/ios/Flutter/Debug.xcconfig b/examples/shop_app_with_local_database_example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/examples/shop_app_with_local_database_example/ios/Flutter/Release.xcconfig b/examples/shop_app_with_local_database_example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/examples/shop_app_with_local_database_example/ios/Podfile b/examples/shop_app_with_local_database_example/ios/Podfile new file mode 100644 index 00000000..279576f3 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/examples/shop_app_example/ios/Podfile.lock b/examples/shop_app_with_local_database_example/ios/Podfile.lock similarity index 100% rename from examples/shop_app_example/ios/Podfile.lock rename to examples/shop_app_with_local_database_example/ios/Podfile.lock diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.pbxproj b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..3a975d8f --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,555 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + 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 */; }; + 8085C882D61E5FDEB14A586C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E371307C1A18E2C5A3240413 /* Pods_Runner.framework */; }; + 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 */ + 0A6F4423095F51BC0DB988FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5FCA87C01110C9A88C068605 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 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 = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A66EB26B3E779516B540894E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E371307C1A18E2C5A3240413 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8085C882D61E5FDEB14A586C /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 44BDBC0FFBC73983292F3E91 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E371307C1A18E2C5A3240413 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + AC08E13B47D1115C63660D15 /* Pods */, + 44BDBC0FFBC73983292F3E91 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + AC08E13B47D1115C63660D15 /* Pods */ = { + isa = PBXGroup; + children = ( + A66EB26B3E779516B540894E /* Pods-Runner.debug.xcconfig */, + 0A6F4423095F51BC0DB988FE /* Pods-Runner.release.xcconfig */, + 5FCA87C01110C9A88C068605 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 8BA145D81CCCD6EF6B2CF97B /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 175891D37D8EEF6981AEF14F /* [CP] Embed Pods Frameworks */, + ); + 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 = 1510; + 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 */ + 175891D37D8EEF6981AEF14F /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 8BA145D81CCCD6EF6B2CF97B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + 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 = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + 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 = 12.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)"; + DEVELOPMENT_TEAM = B5U2P45VJN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.shopAppExample; + 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; + 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + 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)"; + DEVELOPMENT_TEAM = B5U2P45VJN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.shopAppExample; + 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)"; + DEVELOPMENT_TEAM = B5U2P45VJN; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.shopAppExample; + 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 */; +} diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..5e31d3d3 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/shop_app_example/ios/Runner/AppDelegate.swift b/examples/shop_app_with_local_database_example/ios/Runner/AppDelegate.swift similarity index 100% rename from examples/shop_app_example/ios/Runner/AppDelegate.swift rename to examples/shop_app_with_local_database_example/ios/Runner/AppDelegate.swift diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -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" + } +} diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 00000000..dc9ada47 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 00000000..28c6bf03 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 00000000..2ccbfd96 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 00000000..f091b6b0 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 00000000..4cde1211 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 00000000..d0ef06e7 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 00000000..dcdc2306 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 00000000..2ccbfd96 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 00000000..c8f9ed8f Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 00000000..a6d6b860 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 00000000..a6d6b860 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 00000000..75b2d164 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 00000000..c4df70d3 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 00000000..6a84f41e Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 00000000..d0e1f585 Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -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" + } +} diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -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. \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/Main.storyboard b/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Info.plist b/examples/shop_app_with_local_database_example/ios/Runner/Info.plist new file mode 100644 index 00000000..dd50cd71 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Shop App Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + shop_app_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/examples/shop_app_with_local_database_example/ios/Runner/Runner-Bridging-Header.h b/examples/shop_app_with_local_database_example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/examples/shop_app_with_local_database_example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/examples/shop_app_with_local_database_example/lib/features/product/bloc/bloc.dart b/examples/shop_app_with_local_database_example/lib/features/product/bloc/bloc.dart new file mode 100644 index 00000000..26e55367 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/bloc/bloc.dart @@ -0,0 +1 @@ +export 'product/product_bloc.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_bloc.dart b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_bloc.dart new file mode 100644 index 00000000..aeabda81 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_bloc.dart @@ -0,0 +1,59 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +part 'product_event.dart'; +part 'product_state.dart'; + +class ProductBloc extends Bloc { + ProductBloc({ + required AbstractProductsRepository productsRepository, + }) : _productsRepository = productsRepository, + super(ProductInitial()) { + on(_loadProduct); + on(_updateProduct); + on(_addToCard); + } + + final AbstractProductsRepository _productsRepository; + + Future _loadProduct( + LoadProduct event, + Emitter emit, + ) async { + try { + emit(ProductLoading()); + final product = await _productsRepository.getProduct(event.id); + emit(ProductLoaded(product)); + } on Exception catch (e, st) { + DI().handle(e, st); + emit(ProductLoadingFailure()); + } + } + + Future _updateProduct( + UpdateProduct event, + Emitter emit, + ) async { + try { + await _productsRepository.addToFavorites(event.product.id); + emit(ProductLoaded(event.product)); + } on Exception catch (e, st) { + DI().handle(e, st); + // emit(ProductLoadingFailure()); + } + } + + Future _addToCard( + AddProductToCart event, + Emitter emit, + ) async { + try { + await _productsRepository.addToCart(event.id); + } on Exception catch (e, st) { + DI().handle(e, st); + } + } +} diff --git a/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_event.dart b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_event.dart new file mode 100644 index 00000000..0893fe6b --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_event.dart @@ -0,0 +1,35 @@ +part of 'product_bloc.dart'; + +abstract class ProductEvent extends Equatable { + const ProductEvent(); + + @override + List get props => []; + + @override + bool? get stringify => true; +} + +class LoadProduct extends ProductEvent { + const LoadProduct(this.id); + final String id; + + @override + List get props => super.props..add(id); +} + +class UpdateProduct extends ProductEvent { + const UpdateProduct(this.product); + final Product product; + + @override + List get props => super.props..add(product); +} + +class AddProductToCart extends ProductEvent { + const AddProductToCart(this.id); + final String id; + + @override + List get props => super.props..add(id); +} diff --git a/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_state.dart b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_state.dart new file mode 100644 index 00000000..bd835b96 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/bloc/product/product_state.dart @@ -0,0 +1,22 @@ +part of 'product_bloc.dart'; + +abstract class ProductState extends Equatable { + const ProductState(); + + @override + List get props => []; +} + +class ProductInitial extends ProductState {} + +class ProductLoading extends ProductState {} + +class ProductLoaded extends ProductState { + const ProductLoaded(this.product); + final Product product; + + @override + List get props => super.props..add(product); +} + +class ProductLoadingFailure extends ProductState {} diff --git a/examples/shop_app_with_local_database_example/lib/features/product/product.dart b/examples/shop_app_with_local_database_example/lib/features/product/product.dart new file mode 100644 index 00000000..00ffcf94 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/product.dart @@ -0,0 +1 @@ +export 'view/view.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/product/view/product_screen.dart b/examples/shop_app_with_local_database_example/lib/features/product/view/product_screen.dart new file mode 100644 index 00000000..4c5768a2 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/view/product_screen.dart @@ -0,0 +1,284 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:talker_shop_app_example/features/product/bloc/bloc.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +class ProductScreen extends StatefulWidget { + const ProductScreen({ + super.key, + }); + + @override + State createState() => _ProductScreenState(); +} + +class _ProductScreenState extends State { + final _productBloc = ProductBloc( + productsRepository: DI(), + ); + + String? _productId; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final args = ModalRoute.of(context)?.settings.arguments; + if (args != null) { + args as Map; + _productId = args['productId']; + _loadProduct(); + } + } + + void _loadProduct() { + if (_productId != null) { + _productBloc.add(LoadProduct(_productId!)); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + foregroundColor: Colors.black, + ), + body: BlocBuilder( + bloc: _productBloc, + builder: (context, state) { + if (state is ProductLoaded) { + final product = state.product; + return Stack( + alignment: Alignment.bottomCenter, + children: [ + Stack( + children: [ + Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration( + gradient: LinearGradient( + stops: [-0.3, 0.9], + begin: Alignment.topCenter, + end: Alignment.bottomRight, + colors: [ + Color(0xFFF1F3F4), + Color(0xFFE3E4E4), + ], + ), + ), + ), + Align( + alignment: Alignment.topCenter, + child: Image.asset( + product.image, + width: double.infinity, + height: 200, + ), + ), + ], + ), + BlocBuilder( + bloc: _productBloc, + builder: (context, state) { + if (state is ProductLoaded) { + final product = state.product; + return Container( + height: 500, + width: double.infinity, + decoration: BoxDecoration( + color: theme.cardColor, + boxShadow: [ + BoxShadow( + color: Colors.grey[400]!, + blurRadius: 30, + ), + ], + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Text( + product.name, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + ), + ), + ), + Flexible( + child: Text( + product.type, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w400, + color: Colors.grey[600], + ), + ), + ), + Flexible( + child: Text( + '${product.price} \$', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + const Spacer(flex: 1), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Flexible( + child: Text( + 'Product details', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + ), + ), + ), + Flexible( + child: Text( + '''It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using ''', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.grey, + ), + ), + ), + ], + ), + const Spacer(flex: 2), + SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 10, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + FloatingActionButton( + backgroundColor: Colors.black, + child: Icon( + Icons.favorite, + color: product.isFavorite + ? Colors.red + : Colors.white, + ), + onPressed: () => + _toggleProductIsFavorite(product), + ), + const SizedBox(width: 20), + Expanded( + child: SizedBox( + height: 55, + child: AddToCartButton( + onPressed: () => + _addProductToCart(product), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + if (state is ProductLoadingFailure) { + return Center( + child: TextButton( + onPressed: _loadProduct, + child: const Text('Try again'), + ), + ); + } + return const Center( + child: CircularProgressIndicator( + color: Colors.black, + ), + ); + }, + ), + ], + ); + } + return const Center(child: CircularProgressIndicator()); + }, + ), + ); + } + + void _addProductToCart(Product product) { + _productBloc.add(AddProductToCart(product.id)); + } + + void _toggleProductIsFavorite(Product product) { + _productBloc.add( + UpdateProduct( + product.copyWith(isFavorite: !product.isFavorite), + ), + ); + } +} + +class AddToCartButton extends StatelessWidget { + const AddToCartButton({ + super.key, + required this.onPressed, + }); + + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return ElevatedButton.icon( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(Colors.black), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + ), + onPressed: onPressed, + icon: const Padding( + padding: EdgeInsets.only( + right: 10.0, + ), + child: Icon( + Icons.shopping_basket, + color: Colors.white, + ), + ), + label: const Row( + children: [ + Text( + 'Add to card', + style: TextStyle(color: Colors.white), + ), + ], + ), + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/features/product/view/view.dart b/examples/shop_app_with_local_database_example/lib/features/product/view/view.dart new file mode 100644 index 00000000..d0c017c8 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/product/view/view.dart @@ -0,0 +1 @@ +export 'product_screen.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/products/bloc/bloc.dart b/examples/shop_app_with_local_database_example/lib/features/products/bloc/bloc.dart new file mode 100644 index 00000000..ed8ca9c1 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/bloc/bloc.dart @@ -0,0 +1 @@ +export 'products/products_bloc.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_bloc.dart b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_bloc.dart new file mode 100644 index 00000000..0d847ef0 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_bloc.dart @@ -0,0 +1,32 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +part 'products_event.dart'; +part 'products_state.dart'; + +class ProductsBloc extends Bloc { + ProductsBloc({required AbstractProductsRepository productsRepository}) + : _productsRepository = productsRepository, + super(ProductsInitial()) { + on(_loadProducts); + } + + final AbstractProductsRepository _productsRepository; + + Future _loadProducts( + LoadProducts event, + Emitter emit, + ) async { + try { + emit(ProductsLoading()); + final products = await _productsRepository.getProductsList(); + emit(ProductsLoaded(products)); + } on Exception catch (e, st) { + DI().handle(e, st); + emit(ProductsLoadingFailure()); + } + } +} diff --git a/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_event.dart b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_event.dart new file mode 100644 index 00000000..07a4b953 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_event.dart @@ -0,0 +1,13 @@ +part of 'products_bloc.dart'; + +abstract class ProductsEvent extends Equatable { + const ProductsEvent(); + + @override + List get props => []; + + @override + bool? get stringify => true; +} + +class LoadProducts extends ProductsEvent {} diff --git a/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_state.dart b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_state.dart new file mode 100644 index 00000000..274d9b6f --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/bloc/products/products_state.dart @@ -0,0 +1,25 @@ +part of 'products_bloc.dart'; + +abstract class ProductsState extends Equatable { + const ProductsState(); + + @override + List get props => []; +} + +class ProductsInitial extends ProductsState {} + +class ProductsLoading extends ProductsState {} + +class ProductsLoaded extends ProductsState { + const ProductsLoaded(this.products); + final List products; + + @override + List get props => super.props..add(products); + + @override + bool? get stringify => true; +} + +class ProductsLoadingFailure extends ProductsState {} diff --git a/examples/shop_app_with_local_database_example/lib/features/products/products.dart b/examples/shop_app_with_local_database_example/lib/features/products/products.dart new file mode 100644 index 00000000..00ffcf94 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/products.dart @@ -0,0 +1 @@ +export 'view/view.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/products/view/products_screen.dart b/examples/shop_app_with_local_database_example/lib/features/products/view/products_screen.dart new file mode 100644 index 00000000..91e48d01 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/view/products_screen.dart @@ -0,0 +1,220 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:talker_shop_app_example/features/products/bloc/products/products_bloc.dart'; +import 'package:talker_shop_app_example/features/products/widgets/widgets.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/ui/ui.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +class ProductsScreen extends StatefulWidget { + const ProductsScreen({ + super.key, + }); + + @override + State createState() => _ProductsScreenState(); +} + +class _ProductsScreenState extends State { + final _productsBloc = ProductsBloc( + productsRepository: DI(), + ); + + @override + void initState() { + _loadProducts(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + pinned: true, + title: const Text( + 'SHOPY', + style: TextStyle(color: Colors.black), + ), + centerTitle: false, + surfaceTintColor: theme.cardColor, + leading: const Icon( + Icons.menu_rounded, + color: Colors.black, + size: 28, + ), + actions: [ + _OpenLogsButton( + onPressed: () => _openTalkerScreen(context), + ), + ], + ), + const SliverToBoxAdapter(child: _ExampleWarning()), + BlocBuilder( + bloc: _productsBloc, + builder: (context, state) { + if (state is ProductsLoaded) { + final products = state.products; + return SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 12) + .copyWith(bottom: 40), + sliver: SliverGrid( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int i) { + return ProductCard( + product: products[i], + onTap: () => _openProductScreen(context, products, i), + ); + }, + childCount: products.length, + ), + gridDelegate: + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 200, + childAspectRatio: 3 / 4, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + ), + ), + ); + } + if (state is ProductsLoadingFailure) { + return SliverFillRemaining( + child: _ErrorScreen(onReload: _loadProducts), + ); + } + return const SliverFillRemaining( + child: Center( + child: CircularProgressIndicator( + color: Colors.black, + ), + ), + ); + }, + ), + ], + ), + ); + } + + void _openTalkerScreen(BuildContext context) => + Navigator.pushNamed(context, Routes.talker); + + void _openProductScreen(BuildContext context, List products, int i) { + Navigator.pushNamed( + context, + Routes.product, + arguments: {'productId': products[i].id}, + ); + } + + void _loadProducts() { + _productsBloc.add(LoadProducts()); + } +} + +class _OpenLogsButton extends StatelessWidget { + const _OpenLogsButton({required this.onPressed}); + + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: ElevatedButton.icon( + style: ButtonStyle( + backgroundColor: const WidgetStatePropertyAll(Colors.black), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + ), + ), + onPressed: onPressed, + icon: const Icon( + Icons.document_scanner, + color: Colors.white, + ), + label: const Text( + 'Open logs', + style: TextStyle( + color: Colors.white, + ), + ), + ), + ); + } +} + +class _ErrorScreen extends StatelessWidget { + const _ErrorScreen({ + required this.onReload, + }); + + final VoidCallback onReload; + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text( + 'Ops! Something not working', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w700), + ), + const Text( + 'It is special error to check how logs working in differend ways of logic', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w400), + textAlign: TextAlign.center, + ), + TextButton( + onPressed: onReload, + child: const Text('Try again'), + ), + ], + ), + ); + } +} + +class _ExampleWarning extends StatelessWidget { + const _ExampleWarning(); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Container( + margin: const EdgeInsets.symmetric(vertical: 12, horizontal: 12), + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + border: Border.all(color: Colors.orange[800]!), + borderRadius: BorderRadius.circular(15), + color: theme.cardColor, + boxShadow: cardShadow, + ), + child: Row( + children: [ + Icon( + Icons.warning_amber_rounded, + color: Colors.orange[800]!, + ), + const SizedBox(width: 10), + Expanded( + child: Text( + _waringText, + style: TextStyle(color: Colors.orange[800]!), + ), + ), + ], + ), + ); + } +} + +const _waringText = + 'In this example, every second http - request will be intentionally incorrect to show all types of logs in TalkerMonitor'; diff --git a/examples/shop_app_with_local_database_example/lib/features/products/view/view.dart b/examples/shop_app_with_local_database_example/lib/features/products/view/view.dart new file mode 100644 index 00000000..36ee4ed0 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/view/view.dart @@ -0,0 +1 @@ +export 'products_screen.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/features/products/widgets/product_card.dart b/examples/shop_app_with_local_database_example/lib/features/products/widgets/product_card.dart new file mode 100644 index 00000000..0139187b --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/widgets/product_card.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/ui/ui.dart'; + +class ProductCard extends StatelessWidget { + const ProductCard({ + super.key, + required this.product, + required this.onTap, + }); + + final Product product; + final VoidCallback onTap; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return GestureDetector( + onTap: onTap, + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: theme.cardColor, + borderRadius: BorderRadius.circular(15), + boxShadow: cardShadow, + ), + child: Stack( + children: [ + Align( + alignment: Alignment.topCenter, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Image.asset( + product.image, + width: double.infinity, + ), + ), + ), + Positioned( + bottom: 10, + left: 10, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Text( + product.name, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + ), + ), + ), + Flexible( + child: Text( + product.type, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + color: Colors.grey[600], + ), + ), + ), + Flexible( + child: Text( + '${product.price} \$', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/features/products/widgets/widgets.dart b/examples/shop_app_with_local_database_example/lib/features/products/widgets/widgets.dart new file mode 100644 index 00000000..5e1cb318 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/features/products/widgets/widgets.dart @@ -0,0 +1 @@ +export 'product_card.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/firebase_options.dart b/examples/shop_app_with_local_database_example/lib/firebase_options.dart new file mode 100644 index 00000000..1a743cd2 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/firebase_options.dart @@ -0,0 +1,64 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for android - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.iOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for ios - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyAn0rfTu-c83sBQzkCOKy-P8Jln4Btietk', + appId: '1:910867081702:web:05b869f960f934ab2a4e27', + messagingSenderId: '910867081702', + projectId: 'talker-7ac5e', + authDomain: 'talker-7ac5e.firebaseapp.com', + storageBucket: 'talker-7ac5e.appspot.com', + measurementId: 'G-N39HBH14D7', + ); +} diff --git a/examples/shop_app_with_local_database_example/lib/main.dart b/examples/shop_app_with_local_database_example/lib/main.dart new file mode 100644 index 00000000..da524032 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/main.dart @@ -0,0 +1,115 @@ +import 'dart:async'; + +import 'package:dio/dio.dart'; +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:talker_bloc_logger/talker_bloc_logger.dart'; +import 'package:talker_dio_logger/talker_dio_logger.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; +import 'package:talker_shop_app_example/ui/presentation_frame.dart'; +import 'package:talker_shop_app_example/ui/ui.dart'; +import 'package:talker_shop_app_example/utils/scroll_behavior.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +import 'firebase_options.dart'; + +void main() { + runZonedGuarded(() async { + WidgetsFlutterBinding.ensureInitialized(); + await _initFirebase(); + _initDependencies(); + runApp(const MyApp()); + }, (Object error, StackTrace stack) { + DI().handle(error, stack, 'Uncaught app exception'); + }); +} + +Future _initDependencies() async { + final talker = await TalkerFlutter.initWithDB( + settings: TalkerSettings( + colors: { + TalkerLogType.verbose: AnsiPen()..red(), + }, + ), + ); + talker.settings.colors.forEach((val1,val2){ + + }); + + talker.verbose('Talker initialization completed-1'); + // talker.verbose('Talker initialization completed-2'); + // talker.verbose('Talker initialization completed-3'); + + + DI.registerSingleton(talker); + + + final talkerDioLogger = TalkerDioLogger( + talker: talker, + settings: const TalkerDioLoggerSettings( + printRequestHeaders: true, + printResponseHeaders: false, + printRequestData: true, + printResponseData: false, + ), + ); + + final dio = Dio(); + dio.interceptors.add(talkerDioLogger); + + DI.registerSingleton( + ProductsRepository(dio: dio), + ); + talker.info('Repositories initialization completed'); + + Bloc.observer = TalkerBlocObserver( + talker: talker, + settings: const TalkerBlocLoggerSettings( + printCreations: false, + printClosings: false, + printStateFullData: false, + ), + ); +} + +Future _initFirebase() async { + if (kIsWeb) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + final analytics = FirebaseAnalytics.instance; + analytics.logAppOpen(); + } +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + scrollBehavior: kIsWeb ? WebScrollBehavior() : null, + title: 'Talker shop app', + theme: lightTheme, + initialRoute: Routes.productsList, + debugShowCheckedModeBanner: false, + routes: appRoutes, + navigatorObservers: [ + TalkerRouteObserver(DI()), + ], + builder: (context, child) { + return PresentationFrame( + talkerTheme: talkerTheme, + child: TalkerWrapper( + talker: DI(), + child: child!, + ), + ); + }, + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/repositories/products/abstarct_products_repository.dart b/examples/shop_app_with_local_database_example/lib/repositories/products/abstarct_products_repository.dart new file mode 100644 index 00000000..97eef77f --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/repositories/products/abstarct_products_repository.dart @@ -0,0 +1,8 @@ +import 'package:talker_shop_app_example/repositories/products/products.dart'; + +abstract class AbstractProductsRepository { + Future> getProductsList(); + Future getProduct(String id); + Future addToFavorites(String id); + Future addToCart(String id); +} diff --git a/examples/shop_app_with_local_database_example/lib/repositories/products/models/models.dart b/examples/shop_app_with_local_database_example/lib/repositories/products/models/models.dart new file mode 100644 index 00000000..4c79dc1d --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/repositories/products/models/models.dart @@ -0,0 +1 @@ +export 'product.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/repositories/products/models/product.dart b/examples/shop_app_with_local_database_example/lib/repositories/products/models/product.dart new file mode 100644 index 00000000..606dafd7 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/repositories/products/models/product.dart @@ -0,0 +1,43 @@ +import 'package:equatable/equatable.dart'; + +class Product extends Equatable { + const Product({ + required this.id, + required this.name, + required this.type, + required this.price, + required this.image, + this.isFavorite = false, + }); + + final String id; + final String name; + final String type; + final double price; + final String image; + final bool isFavorite; + + @override + List get props => [id, name, type, price, image, isFavorite]; + + @override + bool? get stringify => true; + + Product copyWith({ + String? id, + String? name, + String? type, + double? price, + String? image, + bool? isFavorite, + }) { + return Product( + id: id ?? this.id, + name: name ?? this.name, + type: type ?? this.type, + price: price ?? this.price, + image: image ?? this.image, + isFavorite: isFavorite ?? this.isFavorite, + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/repositories/products/products.dart b/examples/shop_app_with_local_database_example/lib/repositories/products/products.dart new file mode 100644 index 00000000..893f1f7b --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/repositories/products/products.dart @@ -0,0 +1,3 @@ +export 'abstarct_products_repository.dart'; +export 'products_repository.dart'; +export 'models/models.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/repositories/products/products_repository.dart b/examples/shop_app_with_local_database_example/lib/repositories/products/products_repository.dart new file mode 100644 index 00000000..f881a09b --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/repositories/products/products_repository.dart @@ -0,0 +1,92 @@ +import 'package:dio/dio.dart'; +import 'package:talker_shop_app_example/repositories/products/products.dart'; + +const _mockProducts = [ + Product( + id: '1', + name: 'Nike Air Plus', + type: 'Running shoes', + price: 299, + image: 'assets/air_max_plus.png', + ), + Product( + id: '2', + name: 'Nike Air White', + type: 'Running shoes', + price: 299, + image: 'assets/air_max_plus_white.png', + ), + Product( + id: '3', + name: 'Dark shoes', + type: 'Walking shoes', + price: 449, + image: 'assets/black.png', + ), + Product( + id: '4', + name: 'Blue shoes', + type: 'Running shoes', + price: 300, + image: 'assets/blue_shoe.png', + ), + Product( + id: '5', + name: 'Red shoes', + type: 'Walking shoes', + price: 300, + image: 'assets/red_shoe.png', + ), +]; + +/// [_requestsCount > 1] - special mock logic +/// to check how logs working in differend ways of logic +class ProductsRepository implements AbstractProductsRepository { + ProductsRepository({required Dio dio}) : _dio = dio; + var _requestsCount = 0; + + final Dio _dio; + + @override + Future> getProductsList() async { + _requestsCount += 1; + if (_requestsCount % 2 != 0) { + await _dio.get('https://jsonplaceholder.typicode.com/users/1'); + return _mockProducts; + } + + /// Incorrect http request path + await _dio.get('https://jsonplaceholder.typicode.com/usetyrtyergvf/1'); + return _mockProducts; + } + + @override + Future getProduct(String id) async { + await _dio.get('https://jsonplaceholder.typicode.com/users/1'); + return _mockProducts.firstWhere((e) => e.id == id); + } + + @override + Future addToFavorites(String id) async { + _requestsCount += 1; + if (_requestsCount % 2 != 0) { + await _dio.put('https://jsonplaceholder.typicode.com/users/1'); + return; + } + + /// Incorrect request + await _dio.put('https://jsonplaceholder.typicode.comuseahstdfr/1'); + } + + @override + Future addToCart(String id) async { + _requestsCount += 1; + if (_requestsCount % 2 != 0) { + await _dio.post('https://jsonplaceholder.typicode.com/users/1'); + return; + } + + /// Incorrect request + await _dio.post('https://jsonplaceholder.typicode.comusyeyrutwyetf/1'); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/ui/presentation_frame.dart b/examples/shop_app_with_local_database_example/lib/ui/presentation_frame.dart new file mode 100644 index 00000000..f5533db6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/ui/presentation_frame.dart @@ -0,0 +1,312 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class PresentationFrame extends StatelessWidget { + const PresentationFrame({ + super.key, + required this.child, + required this.talkerTheme, + }); + + final Widget child; + final TalkerScreenTheme talkerTheme; + + @override + Widget build(BuildContext context) { + if (kIsWeb && MediaQuery.of(context).size.width > 600) { + const MediaQueryData mq = MediaQueryData( + size: Size(414, 896), + padding: EdgeInsets.only(top: 44, bottom: 34), + devicePixelRatio: 2, + ); + return Material( + child: Stack( + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + width: double.infinity, + decoration: const BoxDecoration(color: Colors.red), + child: const Text( + 'Interact with Application to see changes in Logs Preview', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 60, top: 50), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _LogsPreview(talkerTheme: talkerTheme), + const SizedBox(width: 20), + _ApplicationPreview(mq: mq, child: child), + const SizedBox(width: 60), + const _TalkerAboutSection(mq: mq), + ], + ), + ), + ], + ), + ); + } + return child; + } +} + +class _TalkerAboutSection extends StatelessWidget { + const _TalkerAboutSection({ + required this.mq, + }); + + final MediaQueryData mq; + + @override + Widget build(BuildContext context) { + return Flexible( + flex: 2, + child: FittedBox( + fit: BoxFit.scaleDown, + child: Container( + padding: const EdgeInsets.only(bottom: 40), + width: mq.size.width, + height: mq.size.height, + alignment: Alignment.center, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Spacer(), + GestureDetector( + onTap: _openGitHub, + child: Row( + children: [ + const Text( + 'Talker', + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 70, + ), + maxLines: 3, + overflow: TextOverflow.clip, + ), + const SizedBox(width: 10), + Container( + padding: const EdgeInsets.symmetric( + vertical: 4, horizontal: 12), + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(16), + ), + child: const Text( + 'v4.0.0', + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 30, + color: Colors.white, + ), + ), + ), + ], + ), + ), + const Text( + 'Now your app is not\na black box', + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 30, + ), + maxLines: 3, + overflow: TextOverflow.clip, + ), + const Spacer(), + Row( + children: [ + InkWell( + onTap: _openPubDev, + child: Row( + children: [ + Image.asset('assets/flutter.png', height: 70), + const SizedBox(width: 10), + const Text( + 'Flutter', + style: TextStyle( + fontSize: 32, + color: Color(0xFF01579B), + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + const SizedBox(width: 20), + InkWell( + onTap: _openGitHub, + child: Row( + children: [ + Image.asset('assets/github.png', height: 70), + const SizedBox(width: 10), + const Text( + 'GitHub', + style: TextStyle( + fontSize: 32, + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ], + ), + const Spacer(), + ], + ), + ), + ), + ); + } + + void _openGitHub() { + launchUrl(Uri.parse('https://github.com/Frezyx/talker')); + } + + void _openPubDev() { + launchUrl(Uri.parse('https://pub.dev/packages/talker')); + } +} + +class _ApplicationPreview extends StatelessWidget { + const _ApplicationPreview({ + required this.mq, + required this.child, + }); + + final MediaQueryData mq; + final Widget child; + + @override + Widget build(BuildContext context) { + return Flexible( + flex: 3, + child: FittedBox( + fit: BoxFit.contain, + child: Builder(builder: (context) { + final device = MediaQuery( + data: mq, + child: Container( + width: mq.size.width, + height: mq.size.height, + alignment: Alignment.center, + child: child, + ), + ); + return Column( + children: [ + const Text( + 'Application', + style: TextStyle(fontSize: 50), + ), + const SizedBox(height: 16), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50), + border: Border.all(color: Colors.black, width: 12)), + child: ClipRRect( + clipBehavior: Clip.antiAlias, + borderRadius: BorderRadius.circular(38.5), + child: device, + ), + ), + ], + ); + }), + ), + ); + } +} + +class _LogsPreview extends StatelessWidget { + const _LogsPreview({ + required this.talkerTheme, + }); + + final TalkerScreenTheme talkerTheme; + + @override + Widget build(BuildContext context) { + const MediaQueryData mediaQuery = MediaQueryData( + size: Size(800, 896), + padding: EdgeInsets.only(top: 44, bottom: 34), + devicePixelRatio: 2, + ); + return Flexible( + flex: 5, + child: FittedBox( + fit: BoxFit.contain, + child: Builder(builder: (context) { + final device = MediaQuery( + data: mediaQuery, + child: Container( + width: mediaQuery.size.width, + height: mediaQuery.size.height, + alignment: Alignment.center, + child: TalkerBuilder( + talker: DI(), + builder: (context, data) { + final reversedLogs = data.reversed.toList(); + return Container( + color: const Color(0xFF212121), + child: CustomScrollView( + slivers: [ + const SliverToBoxAdapter(child: SizedBox(height: 40)), + SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final data = reversedLogs[index]; + return TalkerDataCard( + data: data, + color: data.getFlutterColor(talkerTheme), + ); + }, + childCount: reversedLogs.length, + ), + ), + ], + ), + ); + }), + ), + ); + return Column( + children: [ + const Text( + 'Logs preview', + style: TextStyle(fontSize: 50), + ), + const SizedBox(height: 16), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Colors.grey[700]!, width: 6), + ), + child: ClipRRect( + clipBehavior: Clip.antiAlias, + borderRadius: BorderRadius.circular(7), + child: device, + ), + ), + ], + ); + }), + ), + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/ui/presentation_widget.dart b/examples/shop_app_with_local_database_example/lib/ui/presentation_widget.dart new file mode 100644 index 00000000..e272efd7 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/ui/presentation_widget.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +class PresentationWidget extends StatelessWidget { + const PresentationWidget({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const Spacer(flex: 2), + Expanded( + flex: 4, + child: Stack( + children: [ + child, + Image.asset('assets/iphone_mockup.png'), + ], + ), + ), + const Spacer(flex: 1), + Expanded( + flex: 4, + child: TalkerScreen(talker: DI()), + ), + const Spacer(flex: 2), + ], + ); + } +} diff --git a/examples/shop_app_with_local_database_example/lib/ui/router.dart b/examples/shop_app_with_local_database_example/lib/ui/router.dart new file mode 100644 index 00000000..1714af41 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/ui/router.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/features/product/product.dart'; +import 'package:talker_shop_app_example/features/products/view/products_screen.dart'; +import 'package:talker_shop_app_example/ui/ui.dart'; +import 'package:talker_shop_app_example/utils/utils.dart'; + +abstract class Routes { + static const productsList = '/products-list'; + static const product = '/product'; + static const talker = '/talker'; +} + +final appRoutes = { + Routes.product: (context) => const ProductScreen(), + Routes.productsList: (context) => const ProductsScreen(), + Routes.talker: (context) => TalkerScreen( + talker: DI(), + theme: talkerTheme, + appBarTitle: "Logger", + ), +}; diff --git a/examples/shop_app_example/lib/ui/theme.dart b/examples/shop_app_with_local_database_example/lib/ui/theme.dart similarity index 100% rename from examples/shop_app_example/lib/ui/theme.dart rename to examples/shop_app_with_local_database_example/lib/ui/theme.dart diff --git a/examples/shop_app_with_local_database_example/lib/ui/ui.dart b/examples/shop_app_with_local_database_example/lib/ui/ui.dart new file mode 100644 index 00000000..9653a727 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/ui/ui.dart @@ -0,0 +1,2 @@ +export 'router.dart'; +export 'theme.dart'; diff --git a/examples/shop_app_with_local_database_example/lib/utils/di.dart b/examples/shop_app_with_local_database_example/lib/utils/di.dart new file mode 100644 index 00000000..f9fc7ecc --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/utils/di.dart @@ -0,0 +1,6 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:get_it/get_it.dart'; + +/// Simplified name for dependency injection / service locator +final DI = GetIt.instance; diff --git a/examples/shop_app_with_local_database_example/lib/utils/scroll_behavior.dart b/examples/shop_app_with_local_database_example/lib/utils/scroll_behavior.dart new file mode 100644 index 00000000..535ead55 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/utils/scroll_behavior.dart @@ -0,0 +1,25 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +/// This class is used to override the default scroll behavior of the +/// [MaterialApp] widget. +/// +/// The default scroll behavior of the [MaterialApp] widget is to only +/// scroll when the user is using a touch device. This class overrides +/// that behavior to allow scrolling when the user is using a mouse +/// device. +/// +/// This class is used in the [MaterialApp.scrollBehavior] property. +/// +/// See: https://docs.flutter.dev/release/breaking-changes/default-scroll-behavior-drag +class WebScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + PointerDeviceKind.invertedStylus, + PointerDeviceKind.stylus, + PointerDeviceKind.trackpad, + PointerDeviceKind.unknown, + }; +} diff --git a/examples/shop_app_with_local_database_example/lib/utils/utils.dart b/examples/shop_app_with_local_database_example/lib/utils/utils.dart new file mode 100644 index 00000000..fc631eb2 --- /dev/null +++ b/examples/shop_app_with_local_database_example/lib/utils/utils.dart @@ -0,0 +1 @@ +export 'di.dart'; diff --git a/examples/shop_app_with_local_database_example/linux/.gitignore b/examples/shop_app_with_local_database_example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/examples/shop_app_with_local_database_example/linux/CMakeLists.txt b/examples/shop_app_with_local_database_example/linux/CMakeLists.txt new file mode 100644 index 00000000..c35b5cc2 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "shop_app_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.shop_app_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/examples/shop_app_with_local_database_example/linux/flutter/CMakeLists.txt b/examples/shop_app_with_local_database_example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.cc b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..72830e35 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) objectbox_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ObjectboxFlutterLibsPlugin"); + objectbox_flutter_libs_plugin_register_with_registrar(objectbox_flutter_libs_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.h b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/examples/shop_app_with_local_database_example/linux/flutter/generated_plugins.cmake b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..f869d600 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,25 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + objectbox_flutter_libs + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/examples/shop_app_with_local_database_example/linux/main.cc b/examples/shop_app_with_local_database_example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/examples/shop_app_with_local_database_example/linux/my_application.cc b/examples/shop_app_with_local_database_example/linux/my_application.cc new file mode 100644 index 00000000..19403d01 --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "shop_app_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "shop_app_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/examples/shop_app_with_local_database_example/linux/my_application.h b/examples/shop_app_with_local_database_example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/examples/shop_app_with_local_database_example/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/examples/shop_app_with_local_database_example/macos/.gitignore b/examples/shop_app_with_local_database_example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Debug.xcconfig b/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Release.xcconfig b/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/shop_app_with_local_database_example/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/shop_app_with_local_database_example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..72be872e --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,22 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import firebase_analytics +import firebase_core +import objectbox_flutter_libs +import path_provider_foundation +import share_plus +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/examples/shop_app_with_local_database_example/macos/Podfile b/examples/shop_app_with_local_database_example/macos/Podfile new file mode 100644 index 00000000..049abe29 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/examples/shop_app_with_local_database_example/macos/Podfile.lock b/examples/shop_app_with_local_database_example/macos/Podfile.lock new file mode 100644 index 00000000..ae4b3e8d --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Podfile.lock @@ -0,0 +1,152 @@ +PODS: + - Firebase/Analytics (10.18.0): + - Firebase/Core + - Firebase/Core (10.18.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.18.0) + - Firebase/CoreOnly (10.18.0): + - FirebaseCore (= 10.18.0) + - firebase_analytics (10.8.0): + - Firebase/Analytics (= 10.18.0) + - firebase_core + - FlutterMacOS + - firebase_core (2.24.2): + - Firebase/CoreOnly (~> 10.18.0) + - FlutterMacOS + - FirebaseAnalytics (10.18.0): + - FirebaseAnalytics/AdIdSupport (= 10.18.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.18.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.18.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreInternal (10.20.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.20.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FlutterMacOS (1.0.0) + - GoogleAppMeasurement (10.18.0): + - GoogleAppMeasurement/AdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.18.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.18.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.18.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleUtilities/AppDelegateSwizzler (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.12.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.12.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.12.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.12.0)" + - GoogleUtilities/Reachability (7.12.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.12.0): + - GoogleUtilities/Logger + - nanopb (2.30909.1): + - nanopb/decode (= 2.30909.1) + - nanopb/encode (= 2.30909.1) + - nanopb/decode (2.30909.1) + - nanopb/encode (2.30909.1) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.3.1) + - share_plus (0.0.1): + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - firebase_analytics (from `Flutter/ephemeral/.symlinks/plugins/firebase_analytics/macos`) + - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - GoogleAppMeasurement + - GoogleUtilities + - nanopb + - PromisesObjC + +EXTERNAL SOURCES: + firebase_analytics: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_analytics/macos + firebase_core: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos + FlutterMacOS: + :path: Flutter/ephemeral + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + +SPEC CHECKSUMS: + Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 + firebase_analytics: 687a47ef9af9c5a8a9fc612c100987f843d0a281 + firebase_core: a74ee8b3ab5f91ae6b73f4913eaca996c24458b6 + FirebaseAnalytics: 4d310b35c48eaa4a058ddc04bdca6bdb5dc0fe80 + FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreInternal: efeeb171ac02d623bdaefe121539939821e10811 + FirebaseInstallations: 558b1da7d65afeb996fd5c814332f013234ece4e + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 + url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 + +PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 + +COCOAPODS: 1.15.2 diff --git a/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.pbxproj b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..15ea646f --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,633 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + D4A1563B3CA8EC3889022EC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77EC58E5FD7E30C7D0038B47 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* shop_app_example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = shop_app_example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4A27279DFB8C88F99AE55955 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 77EC58E5FD7E30C7D0038B47 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 79477C8C921B5EF934B54E01 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + DF150674176AF416ADD84C88 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D4A1563B3CA8EC3889022EC2 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + F6B7B8EC78C2E0B4FA7F0630 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* shop_app_example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 77EC58E5FD7E30C7D0038B47 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F6B7B8EC78C2E0B4FA7F0630 /* Pods */ = { + isa = PBXGroup; + children = ( + 79477C8C921B5EF934B54E01 /* Pods-Runner.debug.xcconfig */, + 4A27279DFB8C88F99AE55955 /* Pods-Runner.release.xcconfig */, + DF150674176AF416ADD84C88 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7EF6B422961D32C0F3338614 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 2B6BBD9ADEEA4B87C4F1BB47 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* shop_app_example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2B6BBD9ADEEA4B87C4F1BB47 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 7EF6B422961D32C0F3338614 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..b8efb95e --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner/AppDelegate.swift b/examples/shop_app_with_local_database_example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 00000000..82b6f9d9 Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 00000000..13b35eba Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 00000000..0a3f5fa4 Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 00000000..bdb57226 Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 00000000..f083318e Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 00000000..326c0e72 Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 00000000..2f1632cf Binary files /dev/null and b/examples/shop_app_with_local_database_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Base.lproj/MainMenu.xib b/examples/shop_app_with_local_database_example/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 00000000..80e867a4 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Configs/AppInfo.xcconfig b/examples/shop_app_with_local_database_example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..b22d5f85 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = shop_app_example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.shopAppExample + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Configs/Debug.xcconfig b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Configs/Release.xcconfig b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Configs/Warnings.xcconfig b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/examples/shop_app_with_local_database_example/macos/Runner/DebugProfile.entitlements b/examples/shop_app_with_local_database_example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Info.plist b/examples/shop_app_with_local_database_example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/shop_app_with_local_database_example/macos/Runner/MainFlutterWindow.swift b/examples/shop_app_with_local_database_example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/examples/shop_app_with_local_database_example/macos/Runner/Release.entitlements b/examples/shop_app_with_local_database_example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/examples/shop_app_with_local_database_example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/examples/shop_app_with_local_database_example/pubspec.lock b/examples/shop_app_with_local_database_example/pubspec.lock new file mode 100644 index 00000000..202e40a6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/pubspec.lock @@ -0,0 +1,653 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "37a42d06068e2fe3deddb2da079a8c4d105f241225ba27b7122b37e9865fd8f7" + url: "https://pub.dev" + source: hosted + version: "1.3.35" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + bloc: + dependency: transitive + description: + name: bloc + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" + url: "https://pub.dev" + source: hosted + version: "8.1.4" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + dio: + dependency: "direct main" + description: + name: dio + sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + url: "https://pub.dev" + source: hosted + version: "5.7.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + equatable: + dependency: "direct main" + description: + name: equatable + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" + source: hosted + version: "2.0.5" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_analytics: + dependency: "direct main" + description: + name: firebase_analytics + sha256: dbf1e7ab22cfb1f4a4adb103b46a26276b4edc593d4a78ef6fb942bafc92e035 + url: "https://pub.dev" + source: hosted + version: "10.10.7" + firebase_analytics_platform_interface: + dependency: transitive + description: + name: firebase_analytics_platform_interface + sha256: "3729b74f8cf1d974a27ba70332ecb55ff5ff560edc8164a6469f4a055b429c37" + url: "https://pub.dev" + source: hosted + version: "3.10.8" + firebase_analytics_web: + dependency: transitive + description: + name: firebase_analytics_web + sha256: "019cd7eee74254d33fbd2e29229367ce33063516bf6b3258a341d89e3b0f1655" + url: "https://pub.dev" + source: hosted + version: "0.5.7+7" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "26de145bb9688a90962faec6f838247377b0b0d32cc0abecd9a4e43525fc856c" + url: "https://pub.dev" + source: hosted + version: "2.32.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: e30da58198a6d4b49d5bce4e852f985c32cb10db329ebef9473db2b9f09ce810 + url: "https://pub.dev" + source: hosted + version: "5.3.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: f967a7138f5d2ffb1ce15950e2a382924239eaa521150a8f144af34e68b3b3e5 + url: "https://pub.dev" + source: hosted + version: "2.18.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.dev" + source: hosted + version: "2.0.5" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_bloc: + dependency: "direct main" + description: + name: flutter_bloc + sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a + url: "https://pub.dev" + source: hosted + version: "8.1.6" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + 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" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 + url: "https://pub.dev" + source: hosted + version: "7.7.0" + group_button: + dependency: transitive + description: + name: group_button + sha256: "0610fcf28ed122bfb4b410fce161a390f7f2531d55d1d65c5375982001415940" + url: "https://pub.dev" + source: hosted + version: "5.3.4" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + objectbox: + dependency: transitive + description: + name: objectbox + sha256: c18d41f4e81e5a30fc0e2200e9e8306f5ccc8a9b61fe3746426359690c33dc7b + url: "https://pub.dev" + source: hosted + version: "1.7.2" + objectbox_flutter_libs: + dependency: transitive + description: + name: objectbox_flutter_libs + sha256: "179a2edfca5eb80abee6e829ebff69872ad20c9f07c2527fe9d098f4bf5a5b83" + url: "https://pub.dev" + source: hosted + version: "1.7.2" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + url: "https://pub.dev" + source: hosted + version: "2.2.10" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + share_plus: + dependency: transitive + description: + name: share_plus + sha256: "9c9bafd4060728d7cdb2464c341743adbd79d327cb067ec7afb64583540b47c8" + url: "https://pub.dev" + source: hosted + version: "10.1.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: c57c0bbfec7142e3a0f55633be504b796af72e60e3c791b44d5a017b985f7a48 + url: "https://pub.dev" + source: hosted + version: "5.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + talker: + dependency: "direct overridden" + description: + path: "../../packages/talker" + relative: true + source: path + version: "4.4.1" + talker_bloc_logger: + dependency: "direct overridden" + description: + path: "../../packages/talker_bloc_logger" + relative: true + source: path + version: "4.4.1" + talker_dio_logger: + dependency: "direct overridden" + description: + path: "../../packages/talker_dio_logger" + relative: true + source: path + version: "4.4.1" + talker_flutter: + dependency: "direct overridden" + description: + path: "../../packages/talker_flutter" + relative: true + source: path + version: "4.4.1" + talker_logger: + dependency: "direct overridden" + description: + path: "../../packages/talker_logger" + relative: true + source: path + version: "4.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 + url: "https://pub.dev" + source: hosted + version: "6.3.9" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" + url: "https://pub.dev" + source: hosted + version: "5.5.4" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/examples/shop_app_with_local_database_example/pubspec.yaml b/examples/shop_app_with_local_database_example/pubspec.yaml new file mode 100644 index 00000000..6a6586ac --- /dev/null +++ b/examples/shop_app_with_local_database_example/pubspec.yaml @@ -0,0 +1,40 @@ +name: talker_shop_app_example +description: Talker flutter example shop application +publish_to: 'none' +version: 1.0.0+1 + +environment: + sdk: '>=2.17.1 <4.0.0' +dependencies: + flutter: + sdk: flutter + + # # talker_flutter: ^4.4.1 + # talker_flutter: + # path: ../../packages/talker_flutter # Local path to talker_flutter package + + # # talker_dio_logger: ^4.4.1 + # talker_dio_logger: + # path: ../../packages/talker_dio_logger # Local path to talker_dio_logger package + # # talker_bloc_logger: ^4.4.1 + # talker_bloc_logger: + # path: ../../packages/talker_bloc_logger # Local path to talker_bloc_logger package + + + get_it: ^7.6.7 + flutter_bloc: ^8.1.3 + equatable: ^2.0.5 + dio: ^5.4.0 + url_launcher: ^6.2.4 + firebase_core: ^2.24.2 + firebase_analytics: ^10.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^3.0.1 + +flutter: + uses-material-design: true + assets: + - assets/ diff --git a/examples/shop_app_with_local_database_example/pubspec_overrides.yaml b/examples/shop_app_with_local_database_example/pubspec_overrides.yaml new file mode 100644 index 00000000..f3666a80 --- /dev/null +++ b/examples/shop_app_with_local_database_example/pubspec_overrides.yaml @@ -0,0 +1,16 @@ +dependency_overrides: + talker_logger: + path: + ../../packages/talker_logger + talker: + path: + ../../packages/talker + talker_flutter: + path: + ../../packages/talker_flutter + talker_dio_logger: + path: + ../../packages/talker_dio_logger + talker_bloc_logger: + path: + ../../packages/talker_bloc_logger \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/web/favicon.png b/examples/shop_app_with_local_database_example/web/favicon.png new file mode 100644 index 00000000..8aaa46ac Binary files /dev/null and b/examples/shop_app_with_local_database_example/web/favicon.png differ diff --git a/examples/shop_app_with_local_database_example/web/icons/Icon-192.png b/examples/shop_app_with_local_database_example/web/icons/Icon-192.png new file mode 100644 index 00000000..b749bfef Binary files /dev/null and b/examples/shop_app_with_local_database_example/web/icons/Icon-192.png differ diff --git a/examples/shop_app_with_local_database_example/web/icons/Icon-512.png b/examples/shop_app_with_local_database_example/web/icons/Icon-512.png new file mode 100644 index 00000000..88cfd48d Binary files /dev/null and b/examples/shop_app_with_local_database_example/web/icons/Icon-512.png differ diff --git a/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-192.png b/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-192.png new file mode 100644 index 00000000..eb9b4d76 Binary files /dev/null and b/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-192.png differ diff --git a/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-512.png b/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-512.png new file mode 100644 index 00000000..d69c5669 Binary files /dev/null and b/examples/shop_app_with_local_database_example/web/icons/Icon-maskable-512.png differ diff --git a/examples/shop_app_with_local_database_example/web/index.html b/examples/shop_app_with_local_database_example/web/index.html new file mode 100644 index 00000000..12334829 --- /dev/null +++ b/examples/shop_app_with_local_database_example/web/index.html @@ -0,0 +1,52 @@ + + + + + + + + Talker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/web/manifest.json b/examples/shop_app_with_local_database_example/web/manifest.json new file mode 100644 index 00000000..f82b6c13 --- /dev/null +++ b/examples/shop_app_with_local_database_example/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "talker", + "short_name": "talker", + "start_url": ".", + "display": "minimal-ui", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/examples/shop_app_with_local_database_example/windows/.gitignore b/examples/shop_app_with_local_database_example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/examples/shop_app_with_local_database_example/windows/CMakeLists.txt b/examples/shop_app_with_local_database_example/windows/CMakeLists.txt new file mode 100644 index 00000000..6eef62e6 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(shop_app_example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "shop_app_example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/examples/shop_app_with_local_database_example/windows/flutter/CMakeLists.txt b/examples/shop_app_with_local_database_example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.cc b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..54bd8462 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + ObjectboxFlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ObjectboxFlutterLibsPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.h b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/examples/shop_app_with_local_database_example/windows/flutter/generated_plugins.cmake b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..568ca8a0 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + firebase_core + objectbox_flutter_libs + share_plus + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/examples/shop_app_with_local_database_example/windows/runner/CMakeLists.txt b/examples/shop_app_with_local_database_example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/examples/shop_app_with_local_database_example/windows/runner/Runner.rc b/examples/shop_app_with_local_database_example/windows/runner/Runner.rc new file mode 100644 index 00000000..41f99269 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "shop_app_example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "shop_app_example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "shop_app_example.exe" "\0" + VALUE "ProductName", "shop_app_example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/examples/shop_app_with_local_database_example/windows/runner/flutter_window.cpp b/examples/shop_app_with_local_database_example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/examples/shop_app_with_local_database_example/windows/runner/flutter_window.h b/examples/shop_app_with_local_database_example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/examples/shop_app_with_local_database_example/windows/runner/main.cpp b/examples/shop_app_with_local_database_example/windows/runner/main.cpp new file mode 100644 index 00000000..96b1d516 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"shop_app_example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/examples/shop_app_with_local_database_example/windows/runner/resource.h b/examples/shop_app_with_local_database_example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/examples/shop_app_with_local_database_example/windows/runner/resources/app_icon.ico b/examples/shop_app_with_local_database_example/windows/runner/resources/app_icon.ico new file mode 100644 index 00000000..c04e20ca Binary files /dev/null and b/examples/shop_app_with_local_database_example/windows/runner/resources/app_icon.ico differ diff --git a/examples/shop_app_with_local_database_example/windows/runner/runner.exe.manifest b/examples/shop_app_with_local_database_example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/examples/shop_app_with_local_database_example/windows/runner/utils.cpp b/examples/shop_app_with_local_database_example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/examples/shop_app_with_local_database_example/windows/runner/utils.h b/examples/shop_app_with_local_database_example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/examples/shop_app_with_local_database_example/windows/runner/win32_window.cpp b/examples/shop_app_with_local_database_example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/examples/shop_app_with_local_database_example/windows/runner/win32_window.h b/examples/shop_app_with_local_database_example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/examples/shop_app_with_local_database_example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/packages/talker/.flutter-plugins b/packages/talker/.flutter-plugins new file mode 100644 index 00000000..b3802aff --- /dev/null +++ b/packages/talker/.flutter-plugins @@ -0,0 +1,7 @@ +# This is a generated file; do not edit or check into version control. +objectbox_flutter_libs=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\objectbox_flutter_libs-1.7.0\\ +path_provider=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider-2.1.5\\ +path_provider_android=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_android-2.2.10\\ +path_provider_foundation=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_foundation-2.4.0\\ +path_provider_linux=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_linux-2.2.1\\ +path_provider_windows=C:\\Users\\venka\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\path_provider_windows-2.3.0\\ diff --git a/packages/talker/lib/objectbox-model.json b/packages/talker/lib/objectbox-model.json new file mode 100644 index 00000000..00e6ad75 --- /dev/null +++ b/packages/talker/lib/objectbox-model.json @@ -0,0 +1,77 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2732766526390766766", + "lastPropertyId": "10:3011623524114326227", + "name": "TalkerData", + "properties": [ + { + "id": "1:3498377610127543967", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:8804727048679347739", + "name": "message", + "type": 9 + }, + { + "id": "3:2057168434422229462", + "name": "key", + "type": 9 + }, + { + "id": "4:5171479136116245782", + "name": "title", + "type": 9 + }, + { + "id": "5:1327192762666128707", + "name": "time", + "type": 10 + }, + { + "id": "6:6157106738757531849", + "name": "logLevelString", + "type": 9 + }, + { + "id": "7:4125526427669596463", + "name": "exceptionMessage", + "type": 9 + }, + { + "id": "8:9082424071939873438", + "name": "errorMessage", + "type": 9 + }, + { + "id": "9:5102783334174280861", + "name": "stackTraceString", + "type": 9 + }, + { + "id": "10:3011623524114326227", + "name": "penColor", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "1:2732766526390766766", + "lastIndexId": "0:0", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/packages/talker/lib/objectbox.g.dart b/packages/talker/lib/objectbox.g.dart new file mode 100644 index 00000000..d42409d7 --- /dev/null +++ b/packages/talker/lib/objectbox.g.dart @@ -0,0 +1,233 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// This code was generated by ObjectBox. To update it run the generator again: +// With a Flutter package, run `flutter pub run build_runner build`. +// With a Dart package, run `dart run build_runner build`. +// See also https://docs.objectbox.io/getting-started#generate-objectbox-code + +// ignore_for_file: camel_case_types +// coverage:ignore-file + +import 'dart:typed_data'; + +import 'package:flat_buffers/flat_buffers.dart' as fb; +import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality +import 'package:objectbox/objectbox.dart'; +import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; + +import 'src/models/talker_data.dart'; + +export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file + +final _entities = [ + ModelEntity( + id: const IdUid(1, 2732766526390766766), + name: 'TalkerData', + lastPropertyId: const IdUid(10, 3011623524114326227), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 3498377610127543967), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 8804727048679347739), + name: 'message', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 2057168434422229462), + name: 'key', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 5171479136116245782), + name: 'title', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 1327192762666128707), + name: 'time', + type: 10, + flags: 0), + ModelProperty( + id: const IdUid(6, 6157106738757531849), + name: 'logLevelString', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 4125526427669596463), + name: 'exceptionMessage', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 9082424071939873438), + name: 'errorMessage', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 5102783334174280861), + name: 'stackTraceString', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(10, 3011623524114326227), + name: 'penColor', + type: 9, + flags: 0) + ], + relations: [], + backlinks: []) +]; + +/// Open an ObjectBox store with the model declared in this file. +Future openStore( + {String? directory, + int? maxDBSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup}) async => + Store(getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup); + +/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel()) +ModelDefinition getObjectBoxModel() { + final model = ModelInfo( + entities: _entities, + lastEntityId: const IdUid(1, 2732766526390766766), + lastIndexId: const IdUid(0, 0), + lastRelationId: const IdUid(0, 0), + lastSequenceId: const IdUid(0, 0), + retiredEntityUids: const [], + retiredIndexUids: const [], + retiredPropertyUids: const [], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1); + + final bindings = { + TalkerData: EntityDefinition( + model: _entities[0], + toOneRelations: (TalkerData object) => [], + toManyRelations: (TalkerData object) => {}, + getId: (TalkerData object) => object.id, + setId: (TalkerData object, int id) { + object.id = id; + }, + objectToFB: (TalkerData object, fb.Builder fbb) { + final messageOffset = + object.message == null ? null : fbb.writeString(object.message!); + final keyOffset = + object.key == null ? null : fbb.writeString(object.key!); + final titleOffset = + object.title == null ? null : fbb.writeString(object.title!); + final logLevelStringOffset = object.logLevelString == null + ? null + : fbb.writeString(object.logLevelString!); + final exceptionMessageOffset = object.exceptionMessage == null + ? null + : fbb.writeString(object.exceptionMessage!); + final errorMessageOffset = object.errorMessage == null + ? null + : fbb.writeString(object.errorMessage!); + final stackTraceStringOffset = object.stackTraceString == null + ? null + : fbb.writeString(object.stackTraceString!); + final penColorOffset = object.penColor == null + ? null + : fbb.writeString(object.penColor!); + fbb.startTable(11); + fbb.addInt64(0, object.id); + fbb.addOffset(1, messageOffset); + fbb.addOffset(2, keyOffset); + fbb.addOffset(3, titleOffset); + fbb.addInt64(4, object.time.millisecondsSinceEpoch); + fbb.addOffset(5, logLevelStringOffset); + fbb.addOffset(6, exceptionMessageOffset); + fbb.addOffset(7, errorMessageOffset); + fbb.addOffset(8, stackTraceStringOffset); + fbb.addOffset(9, penColorOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + + final object = TalkerData( + const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 6), + id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0), + key: const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 8), + title: const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 10), + time: DateTime.fromMillisecondsSinceEpoch( + const fb.Int64Reader().vTableGet(buffer, rootOffset, 12, 0))) + ..logLevelString = const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 14) + ..exceptionMessage = const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 16) + ..errorMessage = const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 18) + ..stackTraceString = const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 20) + ..penColor = const fb.StringReader(asciiOptimization: true) + .vTableGetNullable(buffer, rootOffset, 22); + + return object; + }) + }; + + return ModelDefinition(model, bindings); +} + +/// [TalkerData] entity fields to define ObjectBox queries. +class TalkerData_ { + /// see [TalkerData.id] + static final id = + QueryIntegerProperty(_entities[0].properties[0]); + + /// see [TalkerData.message] + static final message = + QueryStringProperty(_entities[0].properties[1]); + + /// see [TalkerData.key] + static final key = + QueryStringProperty(_entities[0].properties[2]); + + /// see [TalkerData.title] + static final title = + QueryStringProperty(_entities[0].properties[3]); + + /// see [TalkerData.time] + static final time = + QueryIntegerProperty(_entities[0].properties[4]); + + /// see [TalkerData.logLevelString] + static final logLevelString = + QueryStringProperty(_entities[0].properties[5]); + + /// see [TalkerData.exceptionMessage] + static final exceptionMessage = + QueryStringProperty(_entities[0].properties[6]); + + /// see [TalkerData.errorMessage] + static final errorMessage = + QueryStringProperty(_entities[0].properties[7]); + + /// see [TalkerData.stackTraceString] + static final stackTraceString = + QueryStringProperty(_entities[0].properties[8]); + + /// see [TalkerData.penColor] + static final penColor = + QueryStringProperty(_entities[0].properties[9]); +} diff --git a/packages/talker/lib/src/database/db.dart b/packages/talker/lib/src/database/db.dart new file mode 100644 index 00000000..20a0235e --- /dev/null +++ b/packages/talker/lib/src/database/db.dart @@ -0,0 +1,63 @@ +import 'package:talker/objectbox.g.dart'; +import 'package:talker/talker.dart'; + +class TalkerDataStore { + late final Store store; + late final Box _talkerBox; + late final Stream> talkerDataStream; + + static final TalkerDataStore _instance = TalkerDataStore._internal(); + + TalkerDataStore._internal() { + create(); // Ensure this method can handle singleton logic + } + + /// Create an instance of ObjectBox to use throughout the app. + static Future create() async { + // Future openStore() {...} is defined in the generated objectbox.g.dart + final store = await openStore(); + return TalkerDataStore._create(store); + } + + factory TalkerDataStore() { + return _instance; + } + + TalkerDataStore._create(this.store) { + _talkerBox = store.box(); + // Create a query for all items, ordered by time descending + final query = _talkerBox.query() + ..order(TalkerData_.time, flags: Order.descending); + + // Create a stream from the query + talkerDataStream = + query.watch(triggerImmediately: true).map((query) => query.find()); + } + + // Store a single TalkerData + void storeTalkerData(TalkerData data) { + _talkerBox.put(data); + } + + // Delete all TalkerData + void deleteTalkerData() { + _talkerBox.removeAll(); + } + + // Example usage when getting data from ObjectBox + List getTalkerDataWithReconstructedFields() { + final results = _talkerBox.getAll(); + + // Reconstruct transient fields for each result + for (var talkerData in results) { + talkerData.reconstructTransientFields(); + } + + return results; + } + + // Clean up resources + void dispose() { + store.close(); + } +} diff --git a/packages/talker/lib/src/history.dart b/packages/talker/lib/src/history.dart index 20c56742..6bd2b2b2 100644 --- a/packages/talker/lib/src/history.dart +++ b/packages/talker/lib/src/history.dart @@ -8,6 +8,13 @@ class DefaultTalkerHistory implements TalkerHistory { if (history != null) { _history.addAll(history); } + + if (talkerDataStore?.getTalkerDataWithReconstructedFields().length != + null) { + var result = + talkerDataStore?.getTalkerDataWithReconstructedFields() ?? []; + _history.addAll(result); + } } /// Bring [TalkerSettings] to manage some configuration. @@ -29,14 +36,20 @@ class DefaultTalkerHistory implements TalkerHistory { } @override - void write(TalkerData data) { + void write(TalkerData data) async { /// Check if you are authorized to write. + if (settings.useHistory && settings.enabled) { /// Check if you have reached the max number of history and delete them. if (settings.maxHistoryItems <= _history.length) { _history.removeAt(0); } _history.add(data); + + /// check if the permission to store the data in local database is enabled + if (settings.useLocalDatabase) { + talkerDataStore?.storeTalkerData(data); + } } } } diff --git a/packages/talker/lib/src/models/talker_data.dart b/packages/talker/lib/src/models/talker_data.dart index 6734f445..f0377725 100644 --- a/packages/talker/lib/src/models/talker_data.dart +++ b/packages/talker/lib/src/models/talker_data.dart @@ -1,78 +1,138 @@ +import 'package:objectbox/objectbox.dart'; import 'package:talker/talker.dart'; /// Base [Talker] Data transfer object /// Objects of this type are passed through /// handlers observer and stream +@Entity() class TalkerData { + @Id() + int id; + String? message; + String? key; + String? title; + + @Property(type: PropertyType.date) + DateTime time; + + // Stored versions of previously transient fields + String? logLevelString; // Store enum as string + String? exceptionMessage; // Store exception message + String? errorMessage; // Store error message + String? stackTraceString; // Store stack trace as string + String? penColor; // Store pen color information + + // Runtime-only fields + @Transient() + LogLevel? _logLevel; + @Transient() + Object? _exception; + @Transient() + Error? _error; + @Transient() + StackTrace? _stackTrace; + @Transient() + AnsiPen? _pen; + + // Getters and setters for runtime fields + LogLevel? get logLevel => _logLevel; + set logLevel(LogLevel? value) { + _logLevel = value; + logLevelString = value?.toString(); + } + + Object? get exception => _exception; + set exception(Object? value) { + _exception = value; + exceptionMessage = value?.toString(); + } + + Error? get error => _error; + set error(Error? value) { + _error = value; + errorMessage = value?.toString(); + } + + StackTrace? get stackTrace => _stackTrace; + set stackTrace(StackTrace? value) { + _stackTrace = value; + stackTraceString = value?.toString(); + } + + AnsiPen? get pen => _pen; + set pen(AnsiPen? value) { + _pen = value; + penColor = value?.toString(); + } + TalkerData( this.message, { - this.logLevel, - this.exception, - this.error, - this.stackTrace, + this.id = 0, + this.key, this.title = 'log', DateTime? time, - this.pen, - this.key, - }) { - _time = time ?? DateTime.now(); + LogLevel? logLevel, + Object? exception, + Error? error, + StackTrace? stackTrace, + AnsiPen? pen, + }) : time = time ?? DateTime.now() { + this.logLevel = logLevel; + this.exception = exception; + this.error = error; + this.stackTrace = stackTrace; + this.pen = pen; } - late DateTime _time; - - /// {@template talker_data_message} - /// [String] [message] - message describes what happened - /// {@endtemplate} - final String? message; + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '${displayTitleWithTime(timeFormat: timeFormat)}$message$stackTraceString'; + } - final String? key; + // Method to reconstruct all transient fields from stored strings + void reconstructTransientFields() { + reconstructLogLevel(); + reconstructException(); + reconstructError(); + reconstructStackTrace(); + reconstructPen(); + } - /// {@template talker_data_loglevel} - /// [LogLevel] [logLevel] - to control logging output - /// {@endtemplate} - final LogLevel? logLevel; + // Individual reconstruction methods + void reconstructLogLevel() { + if (logLevelString != null) { + _logLevel = LogLevel.values.firstWhere( + (e) => e.toString() == logLevelString, + orElse: () => LogLevel.debug // Provide a default value + ); + } + } - /// {@template talker_data_exception} - /// [Exception?] [exception] - exception if it happened - /// {@endtemplate} - final Object? exception; + void reconstructException() { + if (exceptionMessage != null) { + _exception = Exception(exceptionMessage); + } + } - /// {@template talker_data_error} - /// [Error?] [error] - error if it happened - /// {@endtemplate} - final Error? error; + void reconstructError() { + if (errorMessage != null) { + _error = + ArgumentError(errorMessage!); // Assuming Error has such constructor + } + } - /// {@template talker_data_title} - /// Title of Talker log - /// {@endtemplate} - String? title; + void reconstructStackTrace() { + if (stackTraceString != null) { + _stackTrace = StackTrace.fromString(stackTraceString!); + } + } - /// {@template talker_data_stackTrace} - /// StackTrace?] [stackTrace] - stackTrace if [exception] or [error] happened - /// {@endtemplate} - final StackTrace? stackTrace; - - /// {@template talker_data_time} - /// Internal time when the log occurred - /// {@endtemplate} - DateTime get time => _time; - - /// [AnsiPen?] [pen] - sets your own log color for console - final AnsiPen? pen; - - /// {@template talker_data_generateTextMessage} - /// Internal method that generates - /// a complete message about the event - /// - /// See examples: - /// [TalkerLog] -> [TalkerLog.generateTextMessage] - /// [TalkerException] -> [TalkerException.generateTextMessage] - /// [TalkerError] -> [TalkerError.generateTextMessage] - /// - /// {@endtemplate} - String generateTextMessage( - {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { - return '${displayTitleWithTime(timeFormat: timeFormat)}$message$displayStackTrace'; + /// this is not working now facing some issue with penColor + void reconstructPen() { + if (penColor != null) { + // Reconstruct AnsiPen based on your pen color format + // _pen = AnsiPen()..xterm(int.parse(penColor!)); // Example reconstruction + } } } diff --git a/packages/talker/lib/src/settings.dart b/packages/talker/lib/src/settings.dart index a4f873f8..cc8e82ac 100644 --- a/packages/talker/lib/src/settings.dart +++ b/packages/talker/lib/src/settings.dart @@ -69,12 +69,14 @@ class TalkerSettings { TalkerSettings({ this.enabled = true, bool useHistory = true, + bool useLocalDatabase = true, bool useConsoleLogs = true, int maxHistoryItems = 1000, this.titles = _defaultTitles, Map? colors, TimeFormat timeFormat = TimeFormat.timeAndSeconds, }) : _useHistory = useHistory, + _useLocalDatabase = useLocalDatabase, _useConsoleLogs = useConsoleLogs, _maxHistoryItems = maxHistoryItems, _timeFormat = timeFormat { @@ -92,6 +94,9 @@ class TalkerSettings { bool get useHistory => _useHistory && enabled; final bool _useHistory; + bool get useLocalDatabase => _useLocalDatabase && _useHistory && enabled; + final bool _useLocalDatabase; + /// By default talker print all Errors / Exceptions and logs in console. /// If [true] - printing in console [false] - not printing. bool get useConsoleLogs => _useConsoleLogs && enabled; @@ -173,6 +178,7 @@ class TalkerSettings { TalkerSettings copyWith({ bool? enabled, bool? useHistory, + bool? useLocalDatabase, bool? useConsoleLogs, int? maxHistoryItems, Map? titles, @@ -180,6 +186,7 @@ class TalkerSettings { }) { return TalkerSettings( useHistory: useHistory ?? _useHistory, + useLocalDatabase: useLocalDatabase ?? _useLocalDatabase, useConsoleLogs: useConsoleLogs ?? _useConsoleLogs, maxHistoryItems: maxHistoryItems ?? _maxHistoryItems, enabled: enabled ?? this.enabled, diff --git a/packages/talker/lib/src/talker.dart b/packages/talker/lib/src/talker.dart index 1c6477d0..6a591ddd 100644 --- a/packages/talker/lib/src/talker.dart +++ b/packages/talker/lib/src/talker.dart @@ -1,7 +1,11 @@ import 'dart:async'; +import 'package:talker/src/database/db.dart'; import 'package:talker/talker.dart'; +/// local database - objectbox +late TalkerDataStore? talkerDataStore; + /// Talker - advanced exception handling and logging /// for dart/flutter applications class Talker { @@ -44,6 +48,39 @@ class Talker { _init(filter, settings, logger, observer, errorHandler, history); } + Talker._internal({ + required this.settings, + required TalkerLogger logger, + required TalkerObserver observer, + required TalkerErrorHandler errorHandler, + required TalkerFilter filter, + required TalkerHistory history, + }) : _logger = logger, + _observer = observer, + _errorHandler = errorHandler, + _filter = filter, + _history = history; + + static Future initWithDB({ + TalkerLogger? logger, + TalkerObserver? observer, + TalkerSettings? settings, + TalkerFilter? filter, + TalkerErrorHandler? errorHandler, + TalkerHistory? history, + }) async { + talkerDataStore = await TalkerDataStore.create(); + return Talker._internal( + settings: settings ?? TalkerSettings(), + logger: logger ?? TalkerLogger(), + observer: observer ?? const _DefaultTalkerObserver(), + errorHandler: + errorHandler ?? TalkerErrorHandler(settings ?? TalkerSettings()), + filter: filter ?? _DefaultTalkerFilter(), + history: history ?? DefaultTalkerHistory(settings ?? TalkerSettings()), + ); + } + void _init( TalkerFilter? filter, TalkerSettings? settings, @@ -144,6 +181,9 @@ class Talker { Stream get stream => _talkerStreamController.stream.asBroadcastStream(); + List? get databaseList => + talkerDataStore?.getTalkerDataWithReconstructedFields(); + /// The history stores all information about all events like /// occurred errors [TalkerError]s, exceptions [TalkerException]s /// and logs [TalkerLog]s that have been sent @@ -341,6 +381,9 @@ class Talker { /// Clear log history void cleanHistory() => _history.clean(); + /// Clear local database + void cleanLocalDatabase() => talkerDataStore?.deleteTalkerData(); + /// Method run all [Talker] works /// /// The method will return everything back @@ -353,13 +396,13 @@ class Talker { /// this method stop these processes void disable() => settings.enabled = false; - void _handleLog( + Future _handleLog( dynamic message, Object? exception, StackTrace? stackTrace, LogLevel logLevel, { AnsiPen? pen, - }) { + }) async { final type = TalkerLogType.fromLogLevel(logLevel); final data = TalkerLog( key: type.key, diff --git a/packages/talker/pubspec.yaml b/packages/talker/pubspec.yaml index 9bb15a4a..75307e38 100644 --- a/packages/talker/pubspec.yaml +++ b/packages/talker/pubspec.yaml @@ -16,8 +16,13 @@ environment: sdk: '>=2.17.0 <4.0.0' dependencies: + objectbox: ^1.0.0 + objectbox_flutter_libs: any talker_logger: ^4.4.1 dev_dependencies: lints: ^2.0.0 + objectbox_generator: any + build_runner: ^2.4.11 + test: ^1.22.1 diff --git a/packages/talker_dio_logger/example/pubspec.lock b/packages/talker_dio_logger/example/pubspec.lock index 05f5ebbd..a7ba2da9 100644 --- a/packages/talker_dio_logger/example/pubspec.lock +++ b/packages/talker_dio_logger/example/pubspec.lock @@ -337,7 +337,7 @@ packages: dependency: transitive description: name: talker - sha256: "556ffa26387072702199a7bcf7c9a4672c46aaf28d99d122d72a2c5b6c9e1614" + sha256: "30bbc526bb2e7d465c630f087479616b6b84570728539fde536a3b652acad2f6" url: "https://pub.dev" source: hosted version: "4.4.1" @@ -359,7 +359,7 @@ packages: dependency: transitive description: name: talker_logger - sha256: a0d06d9d29792251145bf19be540bb3bd6c8fb15478b2ea9b26c051dbda39669 + sha256: "515d2e5803928b2bab42108f710c814743965f939be2b4261f9c3045ef8a3fba" url: "https://pub.dev" source: hosted version: "4.4.1" diff --git a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux index 889d772e..13c7e3cc 120000 --- a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux +++ b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -1 +1 @@ -/Users/stanislavilin/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file +C:/Users/venka/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/share_plus b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/share_plus index 1c5e5452..45abbb26 120000 --- a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/share_plus +++ b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/share_plus @@ -1 +1 @@ -/Users/stanislavilin/.pub-cache/hosted/pub.dev/share_plus-10.0.1/ \ No newline at end of file +C:/Users/venka/AppData/Local/Pub/Cache/hosted/pub.dev/share_plus-10.0.1/ \ No newline at end of file diff --git a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux index 0c8d99f4..ff2ef779 120000 --- a/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux +++ b/packages/talker_flutter/example/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux @@ -1 +1 @@ -/Users/stanislavilin/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.0/ \ No newline at end of file +C:/Users/venka/AppData/Local/Pub/Cache/hosted/pub.dev/url_launcher_linux-3.2.0/ \ No newline at end of file diff --git a/packages/talker_flutter/example/pubspec.lock b/packages/talker_flutter/example/pubspec.lock index c3ed401d..5c0b9ef4 100644 --- a/packages/talker_flutter/example/pubspec.lock +++ b/packages/talker_flutter/example/pubspec.lock @@ -329,7 +329,7 @@ packages: dependency: transitive description: name: talker - sha256: "556ffa26387072702199a7bcf7c9a4672c46aaf28d99d122d72a2c5b6c9e1614" + sha256: "30bbc526bb2e7d465c630f087479616b6b84570728539fde536a3b652acad2f6" url: "https://pub.dev" source: hosted version: "4.4.1" @@ -344,7 +344,7 @@ packages: dependency: transitive description: name: talker_logger - sha256: a0d06d9d29792251145bf19be540bb3bd6c8fb15478b2ea9b26c051dbda39669 + sha256: "515d2e5803928b2bab42108f710c814743965f939be2b4261f9c3045ef8a3fba" url: "https://pub.dev" source: hosted version: "4.4.1" diff --git a/packages/talker_flutter/lib/src/extensions/talker_flutter.dart b/packages/talker_flutter/lib/src/extensions/talker_flutter.dart index 55542bd2..8d83bb80 100644 --- a/packages/talker_flutter/lib/src/extensions/talker_flutter.dart +++ b/packages/talker_flutter/lib/src/extensions/talker_flutter.dart @@ -19,6 +19,23 @@ extension TalkerFlutter on Talker { filter: filter, ); + /// init with local database + static Future initWithDB({ + TalkerLogger? logger, + TalkerObserver? observer, + TalkerSettings? settings, + TalkerFilter? filter, + }) async { + return Talker.initWithDB( + logger: (logger ?? TalkerLogger()).copyWith( + output: _defaultFlutterOutput, + ), + settings: settings, + observer: observer, + filter: filter, + ); + } + static dynamic _defaultFlutterOutput(String message) { if (kIsWeb) { // ignore: avoid_print diff --git a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart index a8d5c46c..ed384c4a 100644 --- a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart +++ b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings_bottom_sheet.dart @@ -79,6 +79,34 @@ class _TalkerSettingsBottomSheetState extends State { useHistory: enabled, ), ); + if (enabled == false) { + widget.talker.value.configure( + settings: widget.talker.value.settings.copyWith( + useLocalDatabase: enabled, + ), + ); + } + widget.talker.notifyListeners(); + }, + ), + TalkerSettingsCard( + canEdit: widget.talker.value.settings.enabled, + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Use Local Database Beta', + enabled: widget.talker.value.settings.useLocalDatabase, + onChanged: (enabled) { + widget.talker.value.configure( + settings: widget.talker.value.settings.copyWith( + useLocalDatabase: enabled, + ), + ); + if (enabled) { + widget.talker.value.configure( + settings: widget.talker.value.settings.copyWith( + useHistory: enabled, + ), + ); + } widget.talker.notifyListeners(); }, ), diff --git a/packages/talker_flutter/lib/src/ui/talker_view.dart b/packages/talker_flutter/lib/src/ui/talker_view.dart index 667cacc1..2363265d 100644 --- a/packages/talker_flutter/lib/src/ui/talker_view.dart +++ b/packages/talker_flutter/lib/src/ui/talker_view.dart @@ -135,11 +135,14 @@ class _TalkerViewState extends State { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, - isScrollControlled: false, + isScrollControlled: true, builder: (context) { - return TalkerSettingsBottomSheet( - talkerScreenTheme: theme, - talker: talker, + return Container( + height: MediaQuery.of(context).size.height * 0.7, + child: TalkerSettingsBottomSheet( + talkerScreenTheme: theme, + talker: talker, + ), ); }, ); @@ -199,6 +202,11 @@ class _TalkerViewState extends State { title: 'Clean history', icon: Icons.delete_outline, ), + TalkerActionItem( + onTap: _cleanLocalDatabase, + title: 'Clean local database', + icon: Icons.file_copy, + ), TalkerActionItem( onTap: _shareLogsInFile, title: 'Share logs file', @@ -222,6 +230,11 @@ class _TalkerViewState extends State { _controller.update(); } + void _cleanLocalDatabase() { + widget.talker.cleanLocalDatabase(); + _controller.update(); + } + void _toggleLogsExpanded() { _controller.toggleExpandedLogs(); }