diff --git a/README.md b/README.md index 928aff0a4..40ec2f33c 100644 --- a/README.md +++ b/README.md @@ -185,12 +185,14 @@ And you have **full customization control** over them! class YourCustomLog extends TalkerLog { YourCustomLog(String message) : super(message); + /// Your custom log title @override String get title => 'Custom'; @override String? get key => 'custom_log_key'; + /// Your custom log color @override AnsiPen get pen => AnsiPen()..xterm(121); } @@ -868,6 +870,20 @@ final crashlyticsTalkerObserver = CrashlyticsTalkerObserver(); final talker = Talker(observer: crashlyticsTalkerObserver); ``` +## Custom Settings + +You can create your own custom settings by creating a Custom TalkerSettingsBottomSheet by +subclassing the TalkerSettingsBottomSheetBase, and adding your own TalkerSettingsCard objects +to the Build() function. + +The shop_with_custom_settings example creates a CustomSettings class to hold setting values +(all boolean values for now). The TalkerCustomSettingsBottomSheet class implements a custom bottom +sheet, the custom settings bottom sheet state, and a creator function to be passed into the +TalkerScreen() creation function. + +This example has two custom flags - one that is enabled/disabled by the "Enable" settings flag, +and the other a global custom flag not affected by the "Enable" settings flag. + ## Features list ✅ Logging diff --git a/examples/shop_app_example/.firebaserc b/examples/shop_app/.firebaserc similarity index 100% rename from examples/shop_app_example/.firebaserc rename to examples/shop_app/.firebaserc diff --git a/examples/shop_app_example/.gitignore b/examples/shop_app/.gitignore similarity index 100% rename from examples/shop_app_example/.gitignore rename to examples/shop_app/.gitignore diff --git a/examples/shop_app_example/.metadata b/examples/shop_app/.metadata similarity index 100% rename from examples/shop_app_example/.metadata rename to examples/shop_app/.metadata diff --git a/examples/shop_app_example/README.md b/examples/shop_app/README.md similarity index 100% rename from examples/shop_app_example/README.md rename to examples/shop_app/README.md diff --git a/examples/shop_app_example/analysis_options.yaml b/examples/shop_app/analysis_options.yaml similarity index 100% rename from examples/shop_app_example/analysis_options.yaml rename to examples/shop_app/analysis_options.yaml diff --git a/examples/shop_app_example/android/.gitignore b/examples/shop_app/android/.gitignore similarity index 100% rename from examples/shop_app_example/android/.gitignore rename to examples/shop_app/android/.gitignore diff --git a/examples/shop_app_example/android/app/build.gradle b/examples/shop_app/android/app/build.gradle similarity index 100% rename from examples/shop_app_example/android/app/build.gradle rename to examples/shop_app/android/app/build.gradle diff --git a/examples/shop_app_example/android/app/src/debug/AndroidManifest.xml b/examples/shop_app/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from examples/shop_app_example/android/app/src/debug/AndroidManifest.xml rename to examples/shop_app/android/app/src/debug/AndroidManifest.xml diff --git a/examples/shop_app_example/android/app/src/main/AndroidManifest.xml b/examples/shop_app/android/app/src/main/AndroidManifest.xml similarity index 100% rename from examples/shop_app_example/android/app/src/main/AndroidManifest.xml rename to examples/shop_app/android/app/src/main/AndroidManifest.xml diff --git a/examples/shop_app_example/android/app/src/main/kotlin/com/example/shop_app_example/MainActivity.kt b/examples/shop_app/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/android/app/src/main/res/values/styles.xml diff --git a/examples/shop_app_example/android/app/src/profile/AndroidManifest.xml b/examples/shop_app/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from examples/shop_app_example/android/app/src/profile/AndroidManifest.xml rename to examples/shop_app/android/app/src/profile/AndroidManifest.xml diff --git a/examples/shop_app_example/android/build.gradle b/examples/shop_app/android/build.gradle similarity index 100% rename from examples/shop_app_example/android/build.gradle rename to examples/shop_app/android/build.gradle diff --git a/examples/shop_app_example/android/gradle.properties b/examples/shop_app/android/gradle.properties similarity index 100% rename from examples/shop_app_example/android/gradle.properties rename to examples/shop_app/android/gradle.properties diff --git a/examples/shop_app_example/android/gradle/wrapper/gradle-wrapper.properties b/examples/shop_app/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/shop_app_example/android/gradle/wrapper/gradle-wrapper.properties rename to examples/shop_app/android/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/shop_app_example/android/settings.gradle b/examples/shop_app/android/settings.gradle similarity index 100% rename from examples/shop_app_example/android/settings.gradle rename to examples/shop_app/android/settings.gradle diff --git a/examples/shop_app_example/assets/air_max_plus.png b/examples/shop_app/assets/air_max_plus.png similarity index 100% rename from examples/shop_app_example/assets/air_max_plus.png rename to examples/shop_app/assets/air_max_plus.png diff --git a/examples/shop_app_example/assets/air_max_plus_white.png b/examples/shop_app/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/assets/air_max_plus_white.png diff --git a/examples/shop_app_example/assets/black.png b/examples/shop_app/assets/black.png similarity index 100% rename from examples/shop_app_example/assets/black.png rename to examples/shop_app/assets/black.png diff --git a/examples/shop_app_example/assets/blue_shoe.png b/examples/shop_app/assets/blue_shoe.png similarity index 100% rename from examples/shop_app_example/assets/blue_shoe.png rename to examples/shop_app/assets/blue_shoe.png diff --git a/examples/shop_app_example/assets/flutter.png b/examples/shop_app/assets/flutter.png similarity index 100% rename from examples/shop_app_example/assets/flutter.png rename to examples/shop_app/assets/flutter.png diff --git a/examples/shop_app_example/assets/github.png b/examples/shop_app/assets/github.png similarity index 100% rename from examples/shop_app_example/assets/github.png rename to examples/shop_app/assets/github.png diff --git a/examples/shop_app_example/assets/iphone_mockup.png b/examples/shop_app/assets/iphone_mockup.png similarity index 100% rename from examples/shop_app_example/assets/iphone_mockup.png rename to examples/shop_app/assets/iphone_mockup.png diff --git a/examples/shop_app_example/assets/red_shoe.png b/examples/shop_app/assets/red_shoe.png similarity index 100% rename from examples/shop_app_example/assets/red_shoe.png rename to examples/shop_app/assets/red_shoe.png diff --git a/examples/shop_app_example/devtools_options.yaml b/examples/shop_app/devtools_options.yaml similarity index 100% rename from examples/shop_app_example/devtools_options.yaml rename to examples/shop_app/devtools_options.yaml diff --git a/examples/shop_app_example/firebase.json b/examples/shop_app/firebase.json similarity index 100% rename from examples/shop_app_example/firebase.json rename to examples/shop_app/firebase.json diff --git a/examples/shop_app_example/ios/.gitignore b/examples/shop_app/ios/.gitignore similarity index 100% rename from examples/shop_app_example/ios/.gitignore rename to examples/shop_app/ios/.gitignore diff --git a/examples/shop_app_example/ios/Flutter/AppFrameworkInfo.plist b/examples/shop_app/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from examples/shop_app_example/ios/Flutter/AppFrameworkInfo.plist rename to examples/shop_app/ios/Flutter/AppFrameworkInfo.plist diff --git a/examples/shop_app_example/ios/Flutter/Debug.xcconfig b/examples/shop_app/ios/Flutter/Debug.xcconfig similarity index 100% rename from examples/shop_app_example/ios/Flutter/Debug.xcconfig rename to examples/shop_app/ios/Flutter/Debug.xcconfig diff --git a/examples/shop_app_example/ios/Flutter/Release.xcconfig b/examples/shop_app/ios/Flutter/Release.xcconfig similarity index 100% rename from examples/shop_app_example/ios/Flutter/Release.xcconfig rename to examples/shop_app/ios/Flutter/Release.xcconfig diff --git a/examples/shop_app_example/ios/Podfile b/examples/shop_app/ios/Podfile similarity index 100% rename from examples/shop_app_example/ios/Podfile rename to examples/shop_app/ios/Podfile diff --git a/examples/shop_app_example/ios/Podfile.lock b/examples/shop_app/ios/Podfile.lock similarity index 100% rename from examples/shop_app_example/ios/Podfile.lock rename to examples/shop_app/ios/Podfile.lock diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.pbxproj b/examples/shop_app/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/shop_app_example/ios/Runner.xcodeproj/project.pbxproj rename to examples/shop_app/ios/Runner.xcodeproj/project.pbxproj diff --git a/examples/shop_app_example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/shop_app/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/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/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/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/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/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/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/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/shop_app_example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to examples/shop_app/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app/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/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_app/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/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/examples/shop_app_example/ios/Runner/AppDelegate.swift b/examples/shop_app/ios/Runner/AppDelegate.swift similarity index 100% rename from examples/shop_app_example/ios/Runner/AppDelegate.swift rename to examples/shop_app/ios/Runner/AppDelegate.swift diff --git a/examples/shop_app_example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/examples/shop_app_example/ios/Runner/Base.lproj/Main.storyboard b/examples/shop_app/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/ios/Runner/Base.lproj/Main.storyboard diff --git a/examples/shop_app_example/ios/Runner/Info.plist b/examples/shop_app/ios/Runner/Info.plist similarity index 100% rename from examples/shop_app_example/ios/Runner/Info.plist rename to examples/shop_app/ios/Runner/Info.plist diff --git a/examples/shop_app_example/ios/Runner/Runner-Bridging-Header.h b/examples/shop_app/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/ios/Runner/Runner-Bridging-Header.h diff --git a/examples/shop_app_example/lib/features/product/bloc/bloc.dart b/examples/shop_app/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/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/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/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/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/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/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/lib/features/product/bloc/product/product_state.dart diff --git a/examples/shop_app_example/lib/features/product/product.dart b/examples/shop_app/lib/features/product/product.dart similarity index 100% rename from examples/shop_app_example/lib/features/product/product.dart rename to examples/shop_app/lib/features/product/product.dart diff --git a/examples/shop_app_example/lib/features/product/view/product_screen.dart b/examples/shop_app/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/lib/features/product/view/product_screen.dart diff --git a/examples/shop_app_example/lib/features/product/view/view.dart b/examples/shop_app/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/lib/features/product/view/view.dart diff --git a/examples/shop_app_example/lib/features/products/bloc/bloc.dart b/examples/shop_app/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/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/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/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/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/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/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/lib/features/products/bloc/products/products_state.dart diff --git a/examples/shop_app_example/lib/features/products/products.dart b/examples/shop_app/lib/features/products/products.dart similarity index 100% rename from examples/shop_app_example/lib/features/products/products.dart rename to examples/shop_app/lib/features/products/products.dart diff --git a/examples/shop_app_example/lib/features/products/view/products_screen.dart b/examples/shop_app/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/lib/features/products/view/products_screen.dart diff --git a/examples/shop_app_example/lib/features/products/view/view.dart b/examples/shop_app/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/lib/features/products/view/view.dart diff --git a/examples/shop_app_example/lib/features/products/widgets/product_card.dart b/examples/shop_app/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/lib/features/products/widgets/product_card.dart diff --git a/examples/shop_app_example/lib/features/products/widgets/widgets.dart b/examples/shop_app/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/lib/features/products/widgets/widgets.dart diff --git a/examples/shop_app_example/lib/firebase_options.dart b/examples/shop_app/lib/firebase_options.dart similarity index 100% rename from examples/shop_app_example/lib/firebase_options.dart rename to examples/shop_app/lib/firebase_options.dart diff --git a/examples/shop_app_example/lib/main.dart b/examples/shop_app/lib/main.dart similarity index 100% rename from examples/shop_app_example/lib/main.dart rename to examples/shop_app/lib/main.dart diff --git a/examples/shop_app_example/lib/repositories/products/abstarct_products_repository.dart b/examples/shop_app/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/lib/repositories/products/abstarct_products_repository.dart diff --git a/examples/shop_app_example/lib/repositories/products/models/models.dart b/examples/shop_app/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/lib/repositories/products/models/models.dart diff --git a/examples/shop_app_example/lib/repositories/products/models/product.dart b/examples/shop_app/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/lib/repositories/products/models/product.dart diff --git a/examples/shop_app_example/lib/repositories/products/products.dart b/examples/shop_app/lib/repositories/products/products.dart similarity index 100% rename from examples/shop_app_example/lib/repositories/products/products.dart rename to examples/shop_app/lib/repositories/products/products.dart diff --git a/examples/shop_app_example/lib/repositories/products/products_repository.dart b/examples/shop_app/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/lib/repositories/products/products_repository.dart diff --git a/examples/shop_app_example/lib/ui/presentation_frame.dart b/examples/shop_app/lib/ui/presentation_frame.dart similarity index 100% rename from examples/shop_app_example/lib/ui/presentation_frame.dart rename to examples/shop_app/lib/ui/presentation_frame.dart diff --git a/examples/shop_app_example/lib/ui/presentation_widget.dart b/examples/shop_app/lib/ui/presentation_widget.dart similarity index 100% rename from examples/shop_app_example/lib/ui/presentation_widget.dart rename to examples/shop_app/lib/ui/presentation_widget.dart diff --git a/examples/shop_app_example/lib/ui/router.dart b/examples/shop_app/lib/ui/router.dart similarity index 100% rename from examples/shop_app_example/lib/ui/router.dart rename to examples/shop_app/lib/ui/router.dart diff --git a/examples/shop_app_example/lib/ui/theme.dart b/examples/shop_app/lib/ui/theme.dart similarity index 100% rename from examples/shop_app_example/lib/ui/theme.dart rename to examples/shop_app/lib/ui/theme.dart diff --git a/examples/shop_app_example/lib/ui/ui.dart b/examples/shop_app/lib/ui/ui.dart similarity index 100% rename from examples/shop_app_example/lib/ui/ui.dart rename to examples/shop_app/lib/ui/ui.dart diff --git a/examples/shop_app_example/lib/utils/di.dart b/examples/shop_app/lib/utils/di.dart similarity index 100% rename from examples/shop_app_example/lib/utils/di.dart rename to examples/shop_app/lib/utils/di.dart diff --git a/examples/shop_app_example/lib/utils/good_log.dart b/examples/shop_app/lib/utils/good_log.dart similarity index 100% rename from examples/shop_app_example/lib/utils/good_log.dart rename to examples/shop_app/lib/utils/good_log.dart diff --git a/examples/shop_app_example/lib/utils/scroll_behavior.dart b/examples/shop_app/lib/utils/scroll_behavior.dart similarity index 100% rename from examples/shop_app_example/lib/utils/scroll_behavior.dart rename to examples/shop_app/lib/utils/scroll_behavior.dart diff --git a/examples/shop_app_example/lib/utils/utils.dart b/examples/shop_app/lib/utils/utils.dart similarity index 100% rename from examples/shop_app_example/lib/utils/utils.dart rename to examples/shop_app/lib/utils/utils.dart diff --git a/examples/shop_app_example/linux/.gitignore b/examples/shop_app/linux/.gitignore similarity index 100% rename from examples/shop_app_example/linux/.gitignore rename to examples/shop_app/linux/.gitignore diff --git a/examples/shop_app_example/linux/CMakeLists.txt b/examples/shop_app/linux/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/linux/CMakeLists.txt rename to examples/shop_app/linux/CMakeLists.txt diff --git a/examples/shop_app_example/linux/flutter/CMakeLists.txt b/examples/shop_app/linux/flutter/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/linux/flutter/CMakeLists.txt rename to examples/shop_app/linux/flutter/CMakeLists.txt diff --git a/examples/shop_app_example/linux/flutter/generated_plugin_registrant.cc b/examples/shop_app/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/linux/flutter/generated_plugin_registrant.cc diff --git a/examples/shop_app_example/linux/flutter/generated_plugin_registrant.h b/examples/shop_app/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/linux/flutter/generated_plugin_registrant.h diff --git a/examples/shop_app_example/linux/flutter/generated_plugins.cmake b/examples/shop_app/linux/flutter/generated_plugins.cmake similarity index 100% rename from examples/shop_app_example/linux/flutter/generated_plugins.cmake rename to examples/shop_app/linux/flutter/generated_plugins.cmake diff --git a/examples/shop_app_example/linux/main.cc b/examples/shop_app/linux/main.cc similarity index 100% rename from examples/shop_app_example/linux/main.cc rename to examples/shop_app/linux/main.cc diff --git a/examples/shop_app_example/linux/my_application.cc b/examples/shop_app/linux/my_application.cc similarity index 100% rename from examples/shop_app_example/linux/my_application.cc rename to examples/shop_app/linux/my_application.cc diff --git a/examples/shop_app_example/linux/my_application.h b/examples/shop_app/linux/my_application.h similarity index 100% rename from examples/shop_app_example/linux/my_application.h rename to examples/shop_app/linux/my_application.h diff --git a/examples/shop_app_example/macos/.gitignore b/examples/shop_app/macos/.gitignore similarity index 100% rename from examples/shop_app_example/macos/.gitignore rename to examples/shop_app/macos/.gitignore diff --git a/examples/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig b/examples/shop_app/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Flutter/Flutter-Debug.xcconfig rename to examples/shop_app/macos/Flutter/Flutter-Debug.xcconfig diff --git a/examples/shop_app_example/macos/Flutter/Flutter-Release.xcconfig b/examples/shop_app/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Flutter/Flutter-Release.xcconfig rename to examples/shop_app/macos/Flutter/Flutter-Release.xcconfig diff --git a/examples/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/shop_app/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from examples/shop_app_example/macos/Flutter/GeneratedPluginRegistrant.swift rename to examples/shop_app/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/examples/shop_app_example/macos/Podfile b/examples/shop_app/macos/Podfile similarity index 100% rename from examples/shop_app_example/macos/Podfile rename to examples/shop_app/macos/Podfile diff --git a/examples/shop_app_example/macos/Podfile.lock b/examples/shop_app/macos/Podfile.lock similarity index 100% rename from examples/shop_app_example/macos/Podfile.lock rename to examples/shop_app/macos/Podfile.lock diff --git a/examples/shop_app_example/macos/Runner.xcodeproj/project.pbxproj b/examples/shop_app/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from examples/shop_app_example/macos/Runner.xcodeproj/project.pbxproj rename to examples/shop_app/macos/Runner.xcodeproj/project.pbxproj diff --git a/examples/shop_app_example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app/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/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/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/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/examples/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_app/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from examples/shop_app_example/macos/Runner.xcworkspace/contents.xcworkspacedata rename to examples/shop_app/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/examples/shop_app_example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_app/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/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/examples/shop_app_example/macos/Runner/AppDelegate.swift b/examples/shop_app/macos/Runner/AppDelegate.swift similarity index 100% rename from examples/shop_app_example/macos/Runner/AppDelegate.swift rename to examples/shop_app/macos/Runner/AppDelegate.swift diff --git a/examples/shop_app_example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_app/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/macos/Runner/Base.lproj/MainMenu.xib diff --git a/examples/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig b/examples/shop_app/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/AppInfo.xcconfig rename to examples/shop_app/macos/Runner/Configs/AppInfo.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Debug.xcconfig b/examples/shop_app/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Debug.xcconfig rename to examples/shop_app/macos/Runner/Configs/Debug.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Release.xcconfig b/examples/shop_app/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Release.xcconfig rename to examples/shop_app/macos/Runner/Configs/Release.xcconfig diff --git a/examples/shop_app_example/macos/Runner/Configs/Warnings.xcconfig b/examples/shop_app/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from examples/shop_app_example/macos/Runner/Configs/Warnings.xcconfig rename to examples/shop_app/macos/Runner/Configs/Warnings.xcconfig diff --git a/examples/shop_app_example/macos/Runner/DebugProfile.entitlements b/examples/shop_app/macos/Runner/DebugProfile.entitlements similarity index 100% rename from examples/shop_app_example/macos/Runner/DebugProfile.entitlements rename to examples/shop_app/macos/Runner/DebugProfile.entitlements diff --git a/examples/shop_app_example/macos/Runner/Info.plist b/examples/shop_app/macos/Runner/Info.plist similarity index 100% rename from examples/shop_app_example/macos/Runner/Info.plist rename to examples/shop_app/macos/Runner/Info.plist diff --git a/examples/shop_app_example/macos/Runner/MainFlutterWindow.swift b/examples/shop_app/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from examples/shop_app_example/macos/Runner/MainFlutterWindow.swift rename to examples/shop_app/macos/Runner/MainFlutterWindow.swift diff --git a/examples/shop_app_example/macos/Runner/Release.entitlements b/examples/shop_app/macos/Runner/Release.entitlements similarity index 100% rename from examples/shop_app_example/macos/Runner/Release.entitlements rename to examples/shop_app/macos/Runner/Release.entitlements diff --git a/examples/shop_app_example/pubspec.yaml b/examples/shop_app/pubspec.yaml similarity index 100% rename from examples/shop_app_example/pubspec.yaml rename to examples/shop_app/pubspec.yaml diff --git a/examples/shop_app_example/pubspec_overrides.yaml b/examples/shop_app/pubspec_overrides.yaml similarity index 100% rename from examples/shop_app_example/pubspec_overrides.yaml rename to examples/shop_app/pubspec_overrides.yaml diff --git a/examples/shop_app_example/web/favicon.png b/examples/shop_app/web/favicon.png similarity index 100% rename from examples/shop_app_example/web/favicon.png rename to examples/shop_app/web/favicon.png diff --git a/examples/shop_app_example/web/icons/Icon-192.png b/examples/shop_app/web/icons/Icon-192.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-192.png rename to examples/shop_app/web/icons/Icon-192.png diff --git a/examples/shop_app_example/web/icons/Icon-512.png b/examples/shop_app/web/icons/Icon-512.png similarity index 100% rename from examples/shop_app_example/web/icons/Icon-512.png rename to examples/shop_app/web/icons/Icon-512.png diff --git a/examples/shop_app_example/web/icons/Icon-maskable-192.png b/examples/shop_app/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/web/icons/Icon-maskable-192.png diff --git a/examples/shop_app_example/web/icons/Icon-maskable-512.png b/examples/shop_app/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/web/icons/Icon-maskable-512.png diff --git a/examples/shop_app_example/web/index.html b/examples/shop_app/web/index.html similarity index 100% rename from examples/shop_app_example/web/index.html rename to examples/shop_app/web/index.html diff --git a/examples/shop_app_example/web/manifest.json b/examples/shop_app/web/manifest.json similarity index 100% rename from examples/shop_app_example/web/manifest.json rename to examples/shop_app/web/manifest.json diff --git a/examples/shop_app_example/windows/.gitignore b/examples/shop_app/windows/.gitignore similarity index 100% rename from examples/shop_app_example/windows/.gitignore rename to examples/shop_app/windows/.gitignore diff --git a/examples/shop_app_example/windows/CMakeLists.txt b/examples/shop_app/windows/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/CMakeLists.txt rename to examples/shop_app/windows/CMakeLists.txt diff --git a/examples/shop_app_example/windows/flutter/CMakeLists.txt b/examples/shop_app/windows/flutter/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/flutter/CMakeLists.txt rename to examples/shop_app/windows/flutter/CMakeLists.txt diff --git a/examples/shop_app_example/windows/flutter/generated_plugin_registrant.cc b/examples/shop_app/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/windows/flutter/generated_plugin_registrant.cc diff --git a/examples/shop_app_example/windows/flutter/generated_plugin_registrant.h b/examples/shop_app/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/windows/flutter/generated_plugin_registrant.h diff --git a/examples/shop_app_example/windows/flutter/generated_plugins.cmake b/examples/shop_app/windows/flutter/generated_plugins.cmake similarity index 100% rename from examples/shop_app_example/windows/flutter/generated_plugins.cmake rename to examples/shop_app/windows/flutter/generated_plugins.cmake diff --git a/examples/shop_app_example/windows/runner/CMakeLists.txt b/examples/shop_app/windows/runner/CMakeLists.txt similarity index 100% rename from examples/shop_app_example/windows/runner/CMakeLists.txt rename to examples/shop_app/windows/runner/CMakeLists.txt diff --git a/examples/shop_app_example/windows/runner/Runner.rc b/examples/shop_app/windows/runner/Runner.rc similarity index 100% rename from examples/shop_app_example/windows/runner/Runner.rc rename to examples/shop_app/windows/runner/Runner.rc diff --git a/examples/shop_app_example/windows/runner/flutter_window.cpp b/examples/shop_app/windows/runner/flutter_window.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/flutter_window.cpp rename to examples/shop_app/windows/runner/flutter_window.cpp diff --git a/examples/shop_app_example/windows/runner/flutter_window.h b/examples/shop_app/windows/runner/flutter_window.h similarity index 100% rename from examples/shop_app_example/windows/runner/flutter_window.h rename to examples/shop_app/windows/runner/flutter_window.h diff --git a/examples/shop_app_example/windows/runner/main.cpp b/examples/shop_app/windows/runner/main.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/main.cpp rename to examples/shop_app/windows/runner/main.cpp diff --git a/examples/shop_app_example/windows/runner/resource.h b/examples/shop_app/windows/runner/resource.h similarity index 100% rename from examples/shop_app_example/windows/runner/resource.h rename to examples/shop_app/windows/runner/resource.h diff --git a/examples/shop_app_example/windows/runner/resources/app_icon.ico b/examples/shop_app/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/windows/runner/resources/app_icon.ico diff --git a/examples/shop_app_example/windows/runner/runner.exe.manifest b/examples/shop_app/windows/runner/runner.exe.manifest similarity index 100% rename from examples/shop_app_example/windows/runner/runner.exe.manifest rename to examples/shop_app/windows/runner/runner.exe.manifest diff --git a/examples/shop_app_example/windows/runner/utils.cpp b/examples/shop_app/windows/runner/utils.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/utils.cpp rename to examples/shop_app/windows/runner/utils.cpp diff --git a/examples/shop_app_example/windows/runner/utils.h b/examples/shop_app/windows/runner/utils.h similarity index 100% rename from examples/shop_app_example/windows/runner/utils.h rename to examples/shop_app/windows/runner/utils.h diff --git a/examples/shop_app_example/windows/runner/win32_window.cpp b/examples/shop_app/windows/runner/win32_window.cpp similarity index 100% rename from examples/shop_app_example/windows/runner/win32_window.cpp rename to examples/shop_app/windows/runner/win32_window.cpp diff --git a/examples/shop_app_example/windows/runner/win32_window.h b/examples/shop_app/windows/runner/win32_window.h similarity index 100% rename from examples/shop_app_example/windows/runner/win32_window.h rename to examples/shop_app/windows/runner/win32_window.h diff --git a/examples/shop_with_custom_settings/.firebaserc b/examples/shop_with_custom_settings/.firebaserc new file mode 100644 index 000000000..7b21a1c51 --- /dev/null +++ b/examples/shop_with_custom_settings/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "talker-7ac5e" + } +} diff --git a/examples/shop_with_custom_settings/.gitignore b/examples/shop_with_custom_settings/.gitignore new file mode 100644 index 000000000..1eab1a228 --- /dev/null +++ b/examples/shop_with_custom_settings/.gitignore @@ -0,0 +1,46 @@ +# 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 diff --git a/examples/shop_with_custom_settings/.metadata b/examples/shop_with_custom_settings/.metadata new file mode 100644 index 000000000..9e70ade37 --- /dev/null +++ b/examples/shop_with_custom_settings/.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_with_custom_settings/README.md b/examples/shop_with_custom_settings/README.md new file mode 100644 index 000000000..63efe187b --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/analysis_options.yaml b/examples/shop_with_custom_settings/analysis_options.yaml new file mode 100644 index 000000000..61b6c4de1 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/android/.gitignore b/examples/shop_with_custom_settings/android/.gitignore new file mode 100644 index 000000000..6f568019d --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/android/app/build.gradle b/examples/shop_with_custom_settings/android/app/build.gradle new file mode 100644 index 000000000..167d0ee32 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/build.gradle @@ -0,0 +1,67 @@ +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 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_with_custom_settings_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 + } + } +} + +flutter { + source '../..' +} + +dependencies { +} diff --git a/examples/shop_with_custom_settings/android/app/src/debug/AndroidManifest.xml b/examples/shop_with_custom_settings/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..87bc6c2a9 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/main/AndroidManifest.xml b/examples/shop_with_custom_settings/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..8f8bfef67 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/main/kotlin/com/example/shop_app_with_custom_settings_example/MainActivity.kt b/examples/shop_with_custom_settings/android/app/src/main/kotlin/com/example/shop_app_with_custom_settings_example/MainActivity.kt new file mode 100644 index 000000000..4551069ec --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/kotlin/com/example/shop_app_with_custom_settings_example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.shop_app_with_custom_settings_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/shop_with_custom_settings/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/drawable/launch_background.xml b/examples/shop_with_custom_settings/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..db77bb4b7 Binary files /dev/null and b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..17987b79b Binary files /dev/null and b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..09d439148 Binary files /dev/null and b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d5f1c8d34 Binary files /dev/null and b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4d6372eeb Binary files /dev/null and b/examples/shop_with_custom_settings/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/values-night/styles.xml b/examples/shop_with_custom_settings/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..06952be74 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/main/res/values/styles.xml b/examples/shop_with_custom_settings/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..cb1ef8805 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/examples/shop_with_custom_settings/android/app/src/profile/AndroidManifest.xml b/examples/shop_with_custom_settings/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..87bc6c2a9 --- /dev/null +++ b/examples/shop_with_custom_settings/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/examples/shop_with_custom_settings/android/build.gradle b/examples/shop_with_custom_settings/android/build.gradle new file mode 100644 index 000000000..bc157bd1a --- /dev/null +++ b/examples/shop_with_custom_settings/android/build.gradle @@ -0,0 +1,18 @@ +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_with_custom_settings/android/gradle.properties b/examples/shop_with_custom_settings/android/gradle.properties new file mode 100644 index 000000000..94adc3a3f --- /dev/null +++ b/examples/shop_with_custom_settings/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/examples/shop_with_custom_settings/android/gradle/wrapper/gradle-wrapper.properties b/examples/shop_with_custom_settings/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..cb24abda1 --- /dev/null +++ b/examples/shop_with_custom_settings/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-7.4-all.zip diff --git a/examples/shop_with_custom_settings/android/settings.gradle b/examples/shop_with_custom_settings/android/settings.gradle new file mode 100644 index 000000000..8641c3901 --- /dev/null +++ b/examples/shop_with_custom_settings/android/settings.gradle @@ -0,0 +1,25 @@ +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 + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.1.2" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/examples/shop_with_custom_settings/assets/air_max_plus.png b/examples/shop_with_custom_settings/assets/air_max_plus.png new file mode 100644 index 000000000..8e7491430 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/air_max_plus.png differ diff --git a/examples/shop_with_custom_settings/assets/air_max_plus_white.png b/examples/shop_with_custom_settings/assets/air_max_plus_white.png new file mode 100644 index 000000000..63cb52a50 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/air_max_plus_white.png differ diff --git a/examples/shop_with_custom_settings/assets/black.png b/examples/shop_with_custom_settings/assets/black.png new file mode 100644 index 000000000..6a60b6e4a Binary files /dev/null and b/examples/shop_with_custom_settings/assets/black.png differ diff --git a/examples/shop_with_custom_settings/assets/blue_shoe.png b/examples/shop_with_custom_settings/assets/blue_shoe.png new file mode 100644 index 000000000..f3e8d03d3 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/blue_shoe.png differ diff --git a/examples/shop_with_custom_settings/assets/flutter.png b/examples/shop_with_custom_settings/assets/flutter.png new file mode 100644 index 000000000..c9c7f7169 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/flutter.png differ diff --git a/examples/shop_with_custom_settings/assets/github.png b/examples/shop_with_custom_settings/assets/github.png new file mode 100644 index 000000000..4264efdd7 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/github.png differ diff --git a/examples/shop_with_custom_settings/assets/iphone_mockup.png b/examples/shop_with_custom_settings/assets/iphone_mockup.png new file mode 100644 index 000000000..a0ff5c7c8 Binary files /dev/null and b/examples/shop_with_custom_settings/assets/iphone_mockup.png differ diff --git a/examples/shop_with_custom_settings/assets/red_shoe.png b/examples/shop_with_custom_settings/assets/red_shoe.png new file mode 100644 index 000000000..c975bf52d Binary files /dev/null and b/examples/shop_with_custom_settings/assets/red_shoe.png differ diff --git a/examples/shop_with_custom_settings/devtools_options.yaml b/examples/shop_with_custom_settings/devtools_options.yaml new file mode 100644 index 000000000..7e7e7f67d --- /dev/null +++ b/examples/shop_with_custom_settings/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/examples/shop_with_custom_settings/firebase.json b/examples/shop_with_custom_settings/firebase.json new file mode 100644 index 000000000..66037326c --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/.gitignore b/examples/shop_with_custom_settings/ios/.gitignore new file mode 100644 index 000000000..7a7f9873a --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Flutter/AppFrameworkInfo.plist b/examples/shop_with_custom_settings/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..7c5696400 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Flutter/Debug.xcconfig b/examples/shop_with_custom_settings/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..ec97fc6f3 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Flutter/Release.xcconfig b/examples/shop_with_custom_settings/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..c4855bfe2 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Podfile b/examples/shop_with_custom_settings/ios/Podfile new file mode 100644 index 000000000..279576f38 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Podfile.lock b/examples/shop_with_custom_settings/ios/Podfile.lock new file mode 100644 index 000000000..385e06c20 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/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 + - Flutter + - firebase_core (2.24.2): + - Firebase/CoreOnly (= 10.18.0) + - Flutter + - 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) + - Flutter (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): + - 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: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 + firebase_analytics: b3d6dd14c61549a29abb10e9843446a4d8bb53eb + firebase_core: 0af4a2b24f62071f9bf283691c0ee41556dcb3f5 + FirebaseAnalytics: 4d310b35c48eaa4a058ddc04bdca6bdb5dc0fe80 + FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f + FirebaseCoreInternal: efeeb171ac02d623bdaefe121539939821e10811 + FirebaseInstallations: 558b1da7d65afeb996fd5c814332f013234ece4e + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + GoogleAppMeasurement: 70ce9aa438cff1cfb31ea3e660bcc67734cb716e + GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 + nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 + url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812 + +PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 + +COCOAPODS: 1.15.2 diff --git a/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.pbxproj b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..3a975d8ff --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..5e31d3d34 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/examples/shop_with_custom_settings/ios/Runner/AppDelegate.swift b/examples/shop_with_custom_settings/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 000000000..dc9ada472 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 000000000..28c6bf030 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 000000000..2ccbfd967 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 000000000..f091b6b0b Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 000000000..4cde12118 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 000000000..d0ef06e7e Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 000000000..dcdc2306c Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 000000000..2ccbfd967 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 000000000..c8f9ed8f5 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 000000000..a6d6b8609 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 000000000..a6d6b8609 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 000000000..75b2d164a Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 000000000..c4df70d39 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 000000000..6a84f41e1 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 000000000..d0e1f5853 Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..0bedcf2fd --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 000000000..9da19eaca Binary files /dev/null and b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/shop_with_custom_settings/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/shop_with_custom_settings/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/ios/Runner/Base.lproj/Main.storyboard b/examples/shop_with_custom_settings/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/ios/Runner/Info.plist b/examples/shop_with_custom_settings/ios/Runner/Info.plist new file mode 100644 index 000000000..dd50cd712 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/ios/Runner/Runner-Bridging-Header.h b/examples/shop_with_custom_settings/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/examples/shop_with_custom_settings/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/examples/shop_with_custom_settings/lib/custom_settings_bottom_sheet.dart b/examples/shop_with_custom_settings/lib/custom_settings_bottom_sheet.dart new file mode 100644 index 000000000..b58af05dc --- /dev/null +++ b/examples/shop_with_custom_settings/lib/custom_settings_bottom_sheet.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; + +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/utils/custom_settings.dart'; +import 'package:talker_shop_app_example/utils/di.dart'; + +TalkerSettingsBottomSheetBase talkerCustomSettingsBottomSheetCreator({ + required ValueNotifier talker, + required TalkerScreenTheme talkerScreenTheme}) { + + return TalkerCustomSettingsBottomSheet( + key: UniqueKey(), + talkerScreenTheme: talkerScreenTheme, + talker: talker, + ); +} + +class TalkerCustomSettingsBottomSheet extends TalkerSettingsBottomSheetBase { + const TalkerCustomSettingsBottomSheet({ + super.key, + required super.talkerScreenTheme, + required super.talker, + }) : super(); + + @override + State createState() => + _TalkerCustomSettingsBottomSheetState(); +} + +class _TalkerCustomSettingsBottomSheetState extends State { + + @override + void initState() { + widget.talker.addListener(() { + if (mounted) setState(() {}); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final settings = [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + child: Text( + 'Basic settings', + style: theme.textTheme.titleLarge?.copyWith( + color: widget.talkerScreenTheme.textColor, + fontWeight: FontWeight.w700, + ), + ), + ), + TalkerSettingsCard( + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Enabled', + enabled: widget.talker.value.settings.enabled, + onChanged: (enabled) { + (enabled ? widget.talker.value.enable : widget.talker.value.disable) + .call(); + widget.talker.notifyListeners(); + }, + ), + TalkerSettingsCard( + canEdit: widget.talker.value.settings.enabled, + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Use console logs', + enabled: widget.talker.value.settings.useConsoleLogs, + onChanged: (enabled) { + widget.talker.value.configure( + settings: widget.talker.value.settings.copyWith( + useConsoleLogs: enabled, + ), + ); + widget.talker.notifyListeners(); + }, + ), + TalkerSettingsCard( + canEdit: widget.talker.value.settings.enabled, + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Use history', + enabled: widget.talker.value.settings.useHistory, + onChanged: (enabled) { + widget.talker.value.configure( + settings: widget.talker.value.settings.copyWith( + useHistory: enabled, + ), + ); + widget.talker.notifyListeners(); + }, + ), + TalkerSettingsCard( + canEdit: widget.talker.value.settings.enabled, + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Custom Bool', + enabled: DI().someCustomBool && + widget.talker.value.settings.enabled, + onChanged: (enabled) { + DI().someCustomBool = enabled; + DI().info("Custom Bool set to ${enabled ? 'TRUE' : 'FALSE'}"); + widget.talker.notifyListeners(); + }, + ), + TalkerSettingsCard( + canEdit: true, + talkerScreenTheme: widget.talkerScreenTheme, + title: 'Global Custom Bool', + enabled: DI().anotherCustomBool, + onChanged: (enabled) { + DI().anotherCustomBool = enabled; + DI().info("Global Custom Bool set to ${enabled ? 'TRUE' : 'FALSE'}"); + widget.talker.notifyListeners(); + }, + ), + ]; + + return TalkerBaseBottomSheet( + title: 'Talker Custom Settings', + talkerScreenTheme: widget.talkerScreenTheme, + child: Expanded( + child: CustomScrollView( + slivers: [ + const SliverToBoxAdapter(child: SizedBox(height: 16)), + ...settings.map((e) => SliverToBoxAdapter(child: e)), + ], + ), + ), + ); + } +} diff --git a/examples/shop_with_custom_settings/lib/features/product/bloc/bloc.dart b/examples/shop_with_custom_settings/lib/features/product/bloc/bloc.dart new file mode 100644 index 000000000..26e553676 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/product/bloc/bloc.dart @@ -0,0 +1 @@ +export 'product/product_bloc.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/product/bloc/product/product_bloc.dart b/examples/shop_with_custom_settings/lib/features/product/bloc/product/product_bloc.dart new file mode 100644 index 000000000..aeabda810 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/product/bloc/product/product_event.dart b/examples/shop_with_custom_settings/lib/features/product/bloc/product/product_event.dart new file mode 100644 index 000000000..0893fe6b8 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/product/bloc/product/product_state.dart b/examples/shop_with_custom_settings/lib/features/product/bloc/product/product_state.dart new file mode 100644 index 000000000..bd835b96f --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/product/product.dart b/examples/shop_with_custom_settings/lib/features/product/product.dart new file mode 100644 index 000000000..00ffcf94f --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/product/product.dart @@ -0,0 +1 @@ +export 'view/view.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/product/view/product_screen.dart b/examples/shop_with_custom_settings/lib/features/product/view/product_screen.dart new file mode 100644 index 000000000..4c5768a2f --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/product/view/view.dart b/examples/shop_with_custom_settings/lib/features/product/view/view.dart new file mode 100644 index 000000000..d0c017c8c --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/product/view/view.dart @@ -0,0 +1 @@ +export 'product_screen.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/products/bloc/bloc.dart b/examples/shop_with_custom_settings/lib/features/products/bloc/bloc.dart new file mode 100644 index 000000000..ed8ca9c18 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/products/bloc/bloc.dart @@ -0,0 +1 @@ +export 'products/products_bloc.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/products/bloc/products/products_bloc.dart b/examples/shop_with_custom_settings/lib/features/products/bloc/products/products_bloc.dart new file mode 100644 index 000000000..0d847ef0b --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/products/bloc/products/products_event.dart b/examples/shop_with_custom_settings/lib/features/products/bloc/products/products_event.dart new file mode 100644 index 000000000..07a4b9534 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/products/bloc/products/products_state.dart b/examples/shop_with_custom_settings/lib/features/products/bloc/products/products_state.dart new file mode 100644 index 000000000..274d9b6fe --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/products/products.dart b/examples/shop_with_custom_settings/lib/features/products/products.dart new file mode 100644 index 000000000..00ffcf94f --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/products/products.dart @@ -0,0 +1 @@ +export 'view/view.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/products/view/products_screen.dart b/examples/shop_with_custom_settings/lib/features/products/view/products_screen.dart new file mode 100644 index 000000000..91e48d012 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/products/view/view.dart b/examples/shop_with_custom_settings/lib/features/products/view/view.dart new file mode 100644 index 000000000..36ee4ed04 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/products/view/view.dart @@ -0,0 +1 @@ +export 'products_screen.dart'; diff --git a/examples/shop_with_custom_settings/lib/features/products/widgets/product_card.dart b/examples/shop_with_custom_settings/lib/features/products/widgets/product_card.dart new file mode 100644 index 000000000..0139187b6 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/features/products/widgets/widgets.dart b/examples/shop_with_custom_settings/lib/features/products/widgets/widgets.dart new file mode 100644 index 000000000..5e1cb318e --- /dev/null +++ b/examples/shop_with_custom_settings/lib/features/products/widgets/widgets.dart @@ -0,0 +1 @@ +export 'product_card.dart'; diff --git a/examples/shop_with_custom_settings/lib/firebase_options.dart b/examples/shop_with_custom_settings/lib/firebase_options.dart new file mode 100644 index 000000000..1a743cd27 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/main.dart b/examples/shop_with_custom_settings/lib/main.dart new file mode 100644 index 000000000..7cbc8559f --- /dev/null +++ b/examples/shop_with_custom_settings/lib/main.dart @@ -0,0 +1,111 @@ +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/custom_settings.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'; + +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'); + }); +} + +void _initDependencies() { + final customSettings = CustomSettings(); + DI.registerSingleton(customSettings); + final talker = TalkerFlutter.init( + settings: TalkerSettings( + colors: { + TalkerLogType.verbose.key: AnsiPen()..yellow(), + GoodLog.getKey: GoodLog.getPen, + }, + ), + ); + DI.registerSingleton(talker); + talker.verbose('Talker initialization completed'); + + 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.logCustom(GoodLog('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_with_custom_settings/lib/repositories/products/abstarct_products_repository.dart b/examples/shop_with_custom_settings/lib/repositories/products/abstarct_products_repository.dart new file mode 100644 index 000000000..97eef77f0 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/repositories/products/models/models.dart b/examples/shop_with_custom_settings/lib/repositories/products/models/models.dart new file mode 100644 index 000000000..4c79dc1df --- /dev/null +++ b/examples/shop_with_custom_settings/lib/repositories/products/models/models.dart @@ -0,0 +1 @@ +export 'product.dart'; diff --git a/examples/shop_with_custom_settings/lib/repositories/products/models/product.dart b/examples/shop_with_custom_settings/lib/repositories/products/models/product.dart new file mode 100644 index 000000000..606dafd78 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/repositories/products/products.dart b/examples/shop_with_custom_settings/lib/repositories/products/products.dart new file mode 100644 index 000000000..893f1f7b5 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/repositories/products/products_repository.dart b/examples/shop_with_custom_settings/lib/repositories/products/products_repository.dart new file mode 100644 index 000000000..f881a09b9 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/ui/presentation_frame.dart b/examples/shop_with_custom_settings/lib/ui/presentation_frame.dart new file mode 100644 index 000000000..f5533db6c --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/ui/presentation_widget.dart b/examples/shop_with_custom_settings/lib/ui/presentation_widget.dart new file mode 100644 index 000000000..e272efd7a --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/ui/router.dart b/examples/shop_with_custom_settings/lib/ui/router.dart new file mode 100644 index 000000000..09d25df92 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/ui/router.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; +import 'package:talker_shop_app_example/custom_settings_bottom_sheet.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, + settingsBottomSheetCreator: talkerCustomSettingsBottomSheetCreator, + ), +}; diff --git a/examples/shop_with_custom_settings/lib/ui/theme.dart b/examples/shop_with_custom_settings/lib/ui/theme.dart new file mode 100644 index 000000000..f31f4915a --- /dev/null +++ b/examples/shop_with_custom_settings/lib/ui/theme.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; + +import '../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_with_custom_settings/lib/ui/ui.dart b/examples/shop_with_custom_settings/lib/ui/ui.dart new file mode 100644 index 000000000..9653a7270 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/ui/ui.dart @@ -0,0 +1,2 @@ +export 'router.dart'; +export 'theme.dart'; diff --git a/examples/shop_with_custom_settings/lib/utils/custom_settings.dart b/examples/shop_with_custom_settings/lib/utils/custom_settings.dart new file mode 100644 index 000000000..4bc09f7d7 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/utils/custom_settings.dart @@ -0,0 +1,9 @@ + + +class CustomSettings { + CustomSettings(); + + bool someCustomBool = false; + + bool anotherCustomBool = false; +} \ No newline at end of file diff --git a/examples/shop_with_custom_settings/lib/utils/di.dart b/examples/shop_with_custom_settings/lib/utils/di.dart new file mode 100644 index 000000000..f9fc7ecca --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/utils/good_log.dart b/examples/shop_with_custom_settings/lib/utils/good_log.dart new file mode 100644 index 000000000..ec08e48cf --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/utils/scroll_behavior.dart b/examples/shop_with_custom_settings/lib/utils/scroll_behavior.dart new file mode 100644 index 000000000..535ead558 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/lib/utils/utils.dart b/examples/shop_with_custom_settings/lib/utils/utils.dart new file mode 100644 index 000000000..fc631eb26 --- /dev/null +++ b/examples/shop_with_custom_settings/lib/utils/utils.dart @@ -0,0 +1 @@ +export 'di.dart'; diff --git a/examples/shop_with_custom_settings/linux/.gitignore b/examples/shop_with_custom_settings/linux/.gitignore new file mode 100644 index 000000000..d3896c984 --- /dev/null +++ b/examples/shop_with_custom_settings/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/examples/shop_with_custom_settings/linux/CMakeLists.txt b/examples/shop_with_custom_settings/linux/CMakeLists.txt new file mode 100644 index 000000000..c35b5cc2d --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/linux/flutter/CMakeLists.txt b/examples/shop_with_custom_settings/linux/flutter/CMakeLists.txt new file mode 100644 index 000000000..d5bd01648 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/linux/flutter/generated_plugin_registrant.cc b/examples/shop_with_custom_settings/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..f6f23bfe9 --- /dev/null +++ b/examples/shop_with_custom_settings/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + 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_with_custom_settings/linux/flutter/generated_plugin_registrant.h b/examples/shop_with_custom_settings/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..e0f0a47bc --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/linux/flutter/generated_plugins.cmake b/examples/shop_with_custom_settings/linux/flutter/generated_plugins.cmake new file mode 100644 index 000000000..f16b4c342 --- /dev/null +++ b/examples/shop_with_custom_settings/linux/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + 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_with_custom_settings/linux/main.cc b/examples/shop_with_custom_settings/linux/main.cc new file mode 100644 index 000000000..e7c5c5437 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/linux/my_application.cc b/examples/shop_with_custom_settings/linux/my_application.cc new file mode 100644 index 000000000..19403d018 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/linux/my_application.h b/examples/shop_with_custom_settings/linux/my_application.h new file mode 100644 index 000000000..72271d5e4 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/.gitignore b/examples/shop_with_custom_settings/macos/.gitignore new file mode 100644 index 000000000..746adbb6b --- /dev/null +++ b/examples/shop_with_custom_settings/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/examples/shop_with_custom_settings/macos/Flutter/Flutter-Debug.xcconfig b/examples/shop_with_custom_settings/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000..4b81f9b2d --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Flutter/Flutter-Release.xcconfig b/examples/shop_with_custom_settings/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000..5caa9d157 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/shop_with_custom_settings/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..29f97d7c2 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import firebase_analytics +import firebase_core +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")) + 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_with_custom_settings/macos/Podfile b/examples/shop_with_custom_settings/macos/Podfile new file mode 100644 index 000000000..049abe295 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Podfile.lock b/examples/shop_with_custom_settings/macos/Podfile.lock new file mode 100644 index 000000000..ae4b3e8da --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner.xcodeproj/project.pbxproj b/examples/shop_with_custom_settings/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..15ea646f7 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_with_custom_settings/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_with_custom_settings/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/shop_with_custom_settings/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..b8efb95eb --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/shop_with_custom_settings/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/shop_with_custom_settings/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/shop_with_custom_settings/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/shop_with_custom_settings/macos/Runner/AppDelegate.swift b/examples/shop_with_custom_settings/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000..d53ef6437 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..a2ec33f19 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 000000000..82b6f9d9a Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 000000000..13b35eba5 Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 000000000..0a3f5fa40 Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 000000000..bdb57226d Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 000000000..f083318e0 Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 000000000..326c0e72c Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 000000000..2f1632cfd Binary files /dev/null and b/examples/shop_with_custom_settings/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/examples/shop_with_custom_settings/macos/Runner/Base.lproj/MainMenu.xib b/examples/shop_with_custom_settings/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 000000000..80e867a4e --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/macos/Runner/Configs/AppInfo.xcconfig b/examples/shop_with_custom_settings/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000..b22d5f853 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/Configs/Debug.xcconfig b/examples/shop_with_custom_settings/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000..36b0fd946 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/shop_with_custom_settings/macos/Runner/Configs/Release.xcconfig b/examples/shop_with_custom_settings/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000..dff4f4956 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/shop_with_custom_settings/macos/Runner/Configs/Warnings.xcconfig b/examples/shop_with_custom_settings/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000..42bcbf478 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/DebugProfile.entitlements b/examples/shop_with_custom_settings/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000..dddb8a30c --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/Info.plist b/examples/shop_with_custom_settings/macos/Runner/Info.plist new file mode 100644 index 000000000..4789daa6a --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/MainFlutterWindow.swift b/examples/shop_with_custom_settings/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000..2722837ec --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/macos/Runner/Release.entitlements b/examples/shop_with_custom_settings/macos/Runner/Release.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/examples/shop_with_custom_settings/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/examples/shop_with_custom_settings/pubspec.lock b/examples/shop_with_custom_settings/pubspec.lock new file mode 100644 index 000000000..c244ad672 --- /dev/null +++ b/examples/shop_with_custom_settings/pubspec.lock @@ -0,0 +1,637 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "5534e701a2c505fed1f0799e652dd6ae23bd4d2c4cf797220e5ced5764a7c1c2" + url: "https://pub.dev" + source: hosted + version: "1.3.44" + 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: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" + source: hosted + version: "3.0.5" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + 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: "2c4e7b548d41b46e8aa08bc3bd1163146be7e6d48f678f2e6dd3114994e42458" + url: "https://pub.dev" + source: hosted + version: "11.3.3" + firebase_analytics_platform_interface: + dependency: transitive + description: + name: firebase_analytics_platform_interface + sha256: c259ae890c7d4c5d1675d35936be0b1fcd587fce9645948982cd87ad08df6222 + url: "https://pub.dev" + source: hosted + version: "4.2.5" + firebase_analytics_web: + dependency: transitive + description: + name: firebase_analytics_web + sha256: "5988d1fd022e55515c2a14811c9b5104c32acde115874a9a69ff7c77c4c05cd9" + url: "https://pub.dev" + source: hosted + version: "0.5.10+2" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "51dfe2fbf3a984787a2e7b8592f2f05c986bfedd6fdacea3f9e0a7beb334de96" + url: "https://pub.dev" + source: hosted + version: "3.6.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: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + 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: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + 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: ff97e5e7b2e82e63c82f5658c6ba2605ea831f0f7489b0d2fb255d817ec4eb5e + url: "https://pub.dev" + source: hosted + version: "8.0.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: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + 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: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" + url: "https://pub.dev" + source: hosted + version: "5.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: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.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" + 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: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + url: "https://pub.dev" + source: hosted + version: "2.2.12" + 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: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + 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: fec12c3c39f01e4df1ec6ad92b6e85503c5ca64ffd6e28d18c9ffe53fcc4cb11 + url: "https://pub.dev" + source: hosted + version: "10.0.3" + 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.5.100" + talker_bloc_logger: + dependency: "direct main" + description: + path: "../../packages/talker_bloc_logger" + relative: true + source: path + version: "4.5.2" + talker_dio_logger: + dependency: "direct main" + description: + path: "../../packages/talker_dio_logger" + relative: true + source: path + version: "4.5.2" + talker_flutter: + dependency: "direct main" + description: + path: "../../packages/talker_flutter" + relative: true + source: path + version: "4.5.2" + talker_logger: + dependency: "direct overridden" + description: + path: "../../packages/talker_logger" + relative: true + source: path + version: "4.5.2" + 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: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + 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: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + url: "https://pub.dev" + source: hosted + version: "6.3.12" + 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: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + 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: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" + 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: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec" + url: "https://pub.dev" + source: hosted + version: "5.5.5" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" +sdks: + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/examples/shop_with_custom_settings/pubspec.yaml b/examples/shop_with_custom_settings/pubspec.yaml new file mode 100644 index 000000000..999786e10 --- /dev/null +++ b/examples/shop_with_custom_settings/pubspec.yaml @@ -0,0 +1,36 @@ +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 + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + + talker_flutter: ^4.4.1 + talker_dio_logger: ^4.4.1 + talker_bloc_logger: ^4.4.1 + + get_it: ^8.0.0 + flutter_bloc: ^8.1.3 + equatable: ^2.0.5 + dio: ^5.4.0 + url_launcher: ^6.2.4 + firebase_core: ^3.6.0 + firebase_analytics: ^11.3.3 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +flutter: + uses-material-design: true + assets: + - assets/ diff --git a/examples/shop_with_custom_settings/pubspec_overrides.yaml b/examples/shop_with_custom_settings/pubspec_overrides.yaml new file mode 100644 index 000000000..f3666a801 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/web/favicon.png b/examples/shop_with_custom_settings/web/favicon.png new file mode 100644 index 000000000..8aaa46ac1 Binary files /dev/null and b/examples/shop_with_custom_settings/web/favicon.png differ diff --git a/examples/shop_with_custom_settings/web/icons/Icon-192.png b/examples/shop_with_custom_settings/web/icons/Icon-192.png new file mode 100644 index 000000000..b749bfef0 Binary files /dev/null and b/examples/shop_with_custom_settings/web/icons/Icon-192.png differ diff --git a/examples/shop_with_custom_settings/web/icons/Icon-512.png b/examples/shop_with_custom_settings/web/icons/Icon-512.png new file mode 100644 index 000000000..88cfd48df Binary files /dev/null and b/examples/shop_with_custom_settings/web/icons/Icon-512.png differ diff --git a/examples/shop_with_custom_settings/web/icons/Icon-maskable-192.png b/examples/shop_with_custom_settings/web/icons/Icon-maskable-192.png new file mode 100644 index 000000000..eb9b4d76e Binary files /dev/null and b/examples/shop_with_custom_settings/web/icons/Icon-maskable-192.png differ diff --git a/examples/shop_with_custom_settings/web/icons/Icon-maskable-512.png b/examples/shop_with_custom_settings/web/icons/Icon-maskable-512.png new file mode 100644 index 000000000..d69c56691 Binary files /dev/null and b/examples/shop_with_custom_settings/web/icons/Icon-maskable-512.png differ diff --git a/examples/shop_with_custom_settings/web/index.html b/examples/shop_with_custom_settings/web/index.html new file mode 100644 index 000000000..123348293 --- /dev/null +++ b/examples/shop_with_custom_settings/web/index.html @@ -0,0 +1,52 @@ + + + + + + + + Talker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/shop_with_custom_settings/web/manifest.json b/examples/shop_with_custom_settings/web/manifest.json new file mode 100644 index 000000000..f82b6c13f --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/.gitignore b/examples/shop_with_custom_settings/windows/.gitignore new file mode 100644 index 000000000..d492d0d98 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/CMakeLists.txt b/examples/shop_with_custom_settings/windows/CMakeLists.txt new file mode 100644 index 000000000..6eef62e6c --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/flutter/CMakeLists.txt b/examples/shop_with_custom_settings/windows/flutter/CMakeLists.txt new file mode 100644 index 000000000..930d2071a --- /dev/null +++ b/examples/shop_with_custom_settings/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# 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") + +# === 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" + windows-x64 $ + 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_with_custom_settings/windows/flutter/generated_plugin_registrant.cc b/examples/shop_with_custom_settings/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 000000000..c3d3b6add --- /dev/null +++ b/examples/shop_with_custom_settings/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/examples/shop_with_custom_settings/windows/flutter/generated_plugin_registrant.h b/examples/shop_with_custom_settings/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 000000000..dc139d85a --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/flutter/generated_plugins.cmake b/examples/shop_with_custom_settings/windows/flutter/generated_plugins.cmake new file mode 100644 index 000000000..c04ddae9c --- /dev/null +++ b/examples/shop_with_custom_settings/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + firebase_core + 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_with_custom_settings/windows/runner/CMakeLists.txt b/examples/shop_with_custom_settings/windows/runner/CMakeLists.txt new file mode 100644 index 000000000..17411a8ab --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/Runner.rc b/examples/shop_with_custom_settings/windows/runner/Runner.rc new file mode 100644 index 000000000..41f99269b --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/flutter_window.cpp b/examples/shop_with_custom_settings/windows/runner/flutter_window.cpp new file mode 100644 index 000000000..b43b9095e --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/flutter_window.h b/examples/shop_with_custom_settings/windows/runner/flutter_window.h new file mode 100644 index 000000000..6da0652f0 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/main.cpp b/examples/shop_with_custom_settings/windows/runner/main.cpp new file mode 100644 index 000000000..96b1d516e --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/resource.h b/examples/shop_with_custom_settings/windows/runner/resource.h new file mode 100644 index 000000000..66a65d1e4 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/resources/app_icon.ico b/examples/shop_with_custom_settings/windows/runner/resources/app_icon.ico new file mode 100644 index 000000000..c04e20caf Binary files /dev/null and b/examples/shop_with_custom_settings/windows/runner/resources/app_icon.ico differ diff --git a/examples/shop_with_custom_settings/windows/runner/runner.exe.manifest b/examples/shop_with_custom_settings/windows/runner/runner.exe.manifest new file mode 100644 index 000000000..a42ea7687 --- /dev/null +++ b/examples/shop_with_custom_settings/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/examples/shop_with_custom_settings/windows/runner/utils.cpp b/examples/shop_with_custom_settings/windows/runner/utils.cpp new file mode 100644 index 000000000..f5bf9fa0f --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/utils.h b/examples/shop_with_custom_settings/windows/runner/utils.h new file mode 100644 index 000000000..3879d5475 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/win32_window.cpp b/examples/shop_with_custom_settings/windows/runner/win32_window.cpp new file mode 100644 index 000000000..c10f08dc7 --- /dev/null +++ b/examples/shop_with_custom_settings/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_with_custom_settings/windows/runner/win32_window.h b/examples/shop_with_custom_settings/windows/runner/win32_window.h new file mode 100644 index 000000000..17ba43112 --- /dev/null +++ b/examples/shop_with_custom_settings/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/pubspec.yaml b/packages/talker/pubspec.yaml index 6e2c0926c..f8b6af88f 100644 --- a/packages/talker/pubspec.yaml +++ b/packages/talker/pubspec.yaml @@ -19,5 +19,5 @@ dependencies: talker_logger: ^4.5.3 dev_dependencies: - lints: ^2.0.0 - test: ^1.22.1 + lints: ^5.0.0 + test: ^1.25.8 diff --git a/packages/talker_bloc_logger/pubspec.yaml b/packages/talker_bloc_logger/pubspec.yaml index 81c32a1a7..52e1ce7eb 100644 --- a/packages/talker_bloc_logger/pubspec.yaml +++ b/packages/talker_bloc_logger/pubspec.yaml @@ -21,5 +21,5 @@ dependencies: meta: ^1.8.0 dev_dependencies: - lints: ^2.0.1 - test: ^1.23.1 + lints: ^5.0.0 + test: ^1.25.8 diff --git a/packages/talker_dio_logger/pubspec.yaml b/packages/talker_dio_logger/pubspec.yaml index e5cc287a5..d552693a0 100644 --- a/packages/talker_dio_logger/pubspec.yaml +++ b/packages/talker_dio_logger/pubspec.yaml @@ -21,5 +21,5 @@ dependencies: talker: ^4.5.3 dev_dependencies: - lints: ^2.0.0 - test: ^1.23.1 + lints: ^5.0.0 + test: ^1.25.8 diff --git a/packages/talker_flutter/lib/src/src.dart b/packages/talker_flutter/lib/src/src.dart index ca4312970..e22d26bce 100644 --- a/packages/talker_flutter/lib/src/src.dart +++ b/packages/talker_flutter/lib/src/src.dart @@ -4,9 +4,12 @@ export 'ui/builders/builders.dart'; export 'ui/talker_builder.dart'; export 'ui/talker_listener.dart'; export 'ui/talker_screen.dart'; +export 'ui/talker_settings/talker_settings.dart'; export 'ui/talker_view.dart'; export 'ui/talker_wrapper/talker_wrapper.dart'; export 'ui/theme/theme.dart'; -export 'ui/widgets/data_card.dart'; -export 'ui/widgets/snackbar.dart'; +export 'ui/widgets/talker_base_card.dart'; +export 'ui/widgets/talker_base_bottom_sheet.dart'; +export 'ui/widgets/talker_data_card.dart'; +export 'ui/widgets/talker_snackbar_content.dart'; export 'utils/run_talker_zoned_guarded/run_talker_zoned_guarded.dart'; diff --git a/packages/talker_flutter/lib/src/ui/talker_actions/talker_actions_bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/talker_actions/talker_actions_bottom_sheet.dart index b7b26b1ce..fcb234421 100644 --- a/packages/talker_flutter/lib/src/ui/talker_actions/talker_actions_bottom_sheet.dart +++ b/packages/talker_flutter/lib/src/ui/talker_actions/talker_actions_bottom_sheet.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/widgets/bottom_sheet.dart'; +import 'package:talker_flutter/src/ui/widgets/talker_base_bottom_sheet.dart'; import 'package:talker_flutter/talker_flutter.dart'; class TalkerActionsBottomSheet extends StatelessWidget { @@ -14,7 +14,7 @@ class TalkerActionsBottomSheet extends StatelessWidget { @override Widget build(BuildContext context) { - return BaseBottomSheet( + return TalkerBaseBottomSheet( title: 'Talker Actions', talkerScreenTheme: talkerScreenTheme, child: Container( diff --git a/packages/talker_flutter/lib/src/ui/talker_monitor/widgets/talker_monitor_card.dart b/packages/talker_flutter/lib/src/ui/talker_monitor/widgets/talker_monitor_card.dart index c68706481..1d14b4f16 100644 --- a/packages/talker_flutter/lib/src/ui/talker_monitor/widgets/talker_monitor_card.dart +++ b/packages/talker_flutter/lib/src/ui/talker_monitor/widgets/talker_monitor_card.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/widgets/base_card.dart'; +import 'package:talker_flutter/src/ui/widgets/talker_base_card.dart'; import 'package:talker_flutter/talker_flutter.dart'; class TalkerMonitorCard extends StatelessWidget { diff --git a/packages/talker_flutter/lib/src/ui/talker_screen.dart b/packages/talker_flutter/lib/src/ui/talker_screen.dart index 018a79bb5..81569091b 100644 --- a/packages/talker_flutter/lib/src/ui/talker_screen.dart +++ b/packages/talker_flutter/lib/src/ui/talker_screen.dart @@ -10,6 +10,7 @@ class TalkerScreen extends StatelessWidget { this.theme = const TalkerScreenTheme(), this.itemsBuilder, this.appBarLeading, + this.settingsBottomSheetCreator, }) : super(key: key); /// Talker implementation @@ -28,6 +29,10 @@ class TalkerScreen extends StatelessWidget { /// log items cards in list final TalkerDataBuilder? itemsBuilder; + /// Optional Builder to customize + /// settings bottom sheet to be shown to user + final TalkerSettingsBottomSheetBaseCreator? settingsBottomSheetCreator; + @override Widget build(BuildContext context) { return Scaffold( @@ -37,6 +42,7 @@ class TalkerScreen extends StatelessWidget { theme: theme, appBarTitle: appBarTitle, appBarLeading: appBarLeading, + settingsBottomSheetCreator: settingsBottomSheetCreator, ), ); } diff --git a/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart b/packages/talker_flutter/lib/src/ui/talker_settings/talker_setting_card.dart similarity index 73% rename from packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart rename to packages/talker_flutter/lib/src/ui/talker_settings/talker_setting_card.dart index 5dc45fd46..e7b2ca456 100644 --- a/packages/talker_flutter/lib/src/ui/talker_settings/widgets/talker_setting_card.dart +++ b/packages/talker_flutter/lib/src/ui/talker_settings/talker_setting_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/widgets/base_card.dart'; +import 'package:talker_flutter/src/ui/widgets/talker_base_card.dart'; import 'package:talker_flutter/talker_flutter.dart'; class TalkerSettingsCard extends StatelessWidget { @@ -8,16 +8,18 @@ class TalkerSettingsCard extends StatelessWidget { Key? key, required this.talkerScreenTheme, required this.title, - required this.enabled, - required this.onChanged, + this.enabled = false, + this.onChanged, this.canEdit = true, + this.trailing, }) : super(key: key); final String title; final bool enabled; - final Function(bool enabled) onChanged; + final Function(bool enabled)? onChanged; final TalkerScreenTheme talkerScreenTheme; final bool canEdit; + final Widget? trailing; @override Widget build(BuildContext context) { @@ -40,11 +42,12 @@ class TalkerSettingsCard extends StatelessWidget { fontWeight: FontWeight.w500, ), ), - trailing: CupertinoSwitch( - value: enabled, - trackColor: canEdit ? Colors.red : Colors.grey, - onChanged: canEdit ? onChanged : null, - ), + trailing: trailing ?? + CupertinoSwitch( + value: enabled, + trackColor: canEdit ? Colors.red : Colors.grey, + onChanged: canEdit ? onChanged : null, + ), ), ), ), diff --git a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings.dart b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings.dart index c46231cff..05effc1a3 100644 --- a/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings.dart +++ b/packages/talker_flutter/lib/src/ui/talker_settings/talker_settings.dart @@ -1 +1,2 @@ +export 'talker_setting_card.dart'; export 'talker_settings_bottom_sheet.dart'; 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 a8d5c46c7..56c151266 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 @@ -1,16 +1,17 @@ // ignore_for_file: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member import 'package:flutter/material.dart'; -import 'package:talker_flutter/src/ui/talker_settings/widgets/talker_setting_card.dart'; -import 'package:talker_flutter/src/ui/widgets/bottom_sheet.dart'; +import 'package:talker_flutter/src/ui/talker_settings/talker_setting_card.dart'; +import 'package:talker_flutter/src/ui/widgets/talker_base_bottom_sheet.dart'; import 'package:talker_flutter/talker_flutter.dart'; -class TalkerSettingsBottomSheet extends StatefulWidget { - const TalkerSettingsBottomSheet({ - Key? key, - required this.talkerScreenTheme, - required this.talker, - }) : super(key: key); +// For passing in a SettingsBottomSheetBase Creator to talker_view.dart +typedef TalkerSettingsBottomSheetBaseCreator = TalkerSettingsBottomSheetBase Function({ + required TalkerScreenTheme talkerScreenTheme, + required ValueNotifier talker +}); + +abstract class TalkerSettingsBottomSheetBase extends StatefulWidget { /// Theme for customize [TalkerScreen] final TalkerScreenTheme talkerScreenTheme; @@ -18,6 +19,20 @@ class TalkerSettingsBottomSheet extends StatefulWidget { /// Talker implementation final ValueNotifier talker; + const TalkerSettingsBottomSheetBase({ + Key? key, + required this.talkerScreenTheme, + required this.talker, + }) : super(key: key); +} + +class TalkerSettingsBottomSheet extends TalkerSettingsBottomSheetBase { + const TalkerSettingsBottomSheet({ + Key? key, + required talkerScreenTheme, + required talker, + }) : super(key: key, talkerScreenTheme: talkerScreenTheme, talker: talker); + @override State createState() => _TalkerSettingsBottomSheetState(); @@ -142,7 +157,7 @@ class _TalkerSettingsBottomSheetState extends State { // _TalkerDioLoggerNotSetup(talkerScreenTheme: widget.talkerScreenTheme), ]; - return BaseBottomSheet( + return TalkerBaseBottomSheet( title: 'Talker Settings', talkerScreenTheme: widget.talkerScreenTheme, child: Expanded( diff --git a/packages/talker_flutter/lib/src/ui/talker_view.dart b/packages/talker_flutter/lib/src/ui/talker_view.dart index 667cacc10..92f7a7eed 100644 --- a/packages/talker_flutter/lib/src/ui/talker_view.dart +++ b/packages/talker_flutter/lib/src/ui/talker_view.dart @@ -19,6 +19,7 @@ class TalkerView extends StatefulWidget { this.appBarTitle, this.itemsBuilder, this.appBarLeading, + this.settingsBottomSheetCreator, }) : super(key: key); /// Talker implementation @@ -41,6 +42,8 @@ class TalkerView extends StatefulWidget { final ScrollController? scrollController; + final TalkerSettingsBottomSheetBaseCreator? settingsBottomSheetCreator; + @override State createState() => _TalkerViewState(); } @@ -48,6 +51,7 @@ class TalkerView extends StatefulWidget { class _TalkerViewState extends State { final _titlesController = GroupButtonController(); late final _controller = widget.controller ?? TalkerViewController(); + late final _settingsBottomSheetCreator = widget.settingsBottomSheetCreator; @override Widget build(BuildContext context) { @@ -60,10 +64,10 @@ class _TalkerViewState extends State { return TalkerBuilder( talker: widget.talker, builder: (context, data) { - final filtredElements = + final filteredElements = data.where((e) => _controller.filter.filter(e)).toList(); final titles = data.map((e) => e.title).toList(); - final uniqTitles = titles.toSet().toList(); + final uniqueTitles = titles.toSet().toList(); return CustomScrollView( controller: widget.scrollController, @@ -76,7 +80,7 @@ class _TalkerViewState extends State { talkerTheme: talkerTheme, titlesController: _titlesController, titles: titles, - uniqTitles: uniqTitles, + uniqTitles: uniqueTitles, controller: _controller, onMonitorTap: () => _openTalkerMonitor(context), onActionsTap: () => _showActionsBottomSheet(context), @@ -88,7 +92,7 @@ class _TalkerViewState extends State { SliverList( delegate: SliverChildBuilderDelegate( (context, i) { - final data = _getListItem(filtredElements, i); + final data = _getListItem(filteredElements, i); if (widget.itemsBuilder != null) { return widget.itemsBuilder!.call(context, data); } @@ -100,7 +104,7 @@ class _TalkerViewState extends State { color: data.getFlutterColor(widget.theme), ); }, - childCount: filtredElements.length, + childCount: filteredElements.length, ), ), ], @@ -121,11 +125,11 @@ class _TalkerViewState extends State { } TalkerData _getListItem( - List filtredElements, + List filteredElements, int i, ) { - final data = filtredElements[ - _controller.isLogOrderReversed ? filtredElements.length - 1 - i : i]; + final data = filteredElements[ + _controller.isLogOrderReversed ? filteredElements.length - 1 - i : i]; return data; } @@ -137,10 +141,17 @@ class _TalkerViewState extends State { backgroundColor: Colors.transparent, isScrollControlled: false, builder: (context) { - return TalkerSettingsBottomSheet( - talkerScreenTheme: theme, - talker: talker, - ); + if (_settingsBottomSheetCreator != null) { + return _settingsBottomSheetCreator!( + talkerScreenTheme: theme, + talker: talker, + ); + } else { + return TalkerSettingsBottomSheet( + talkerScreenTheme: theme, + talker: talker, + ); + } }, ); } diff --git a/packages/talker_flutter/lib/src/ui/talker_wrapper/talker_wrapper.dart b/packages/talker_flutter/lib/src/ui/talker_wrapper/talker_wrapper.dart index fd2798b7f..425614cc8 100644 --- a/packages/talker_flutter/lib/src/ui/talker_wrapper/talker_wrapper.dart +++ b/packages/talker_flutter/lib/src/ui/talker_wrapper/talker_wrapper.dart @@ -32,7 +32,7 @@ class TalkerWrapper extends StatelessWidget { showAlert( context, options.exceptionAlertBuilder?.call(context, data) ?? - SnackbarContent( + TalkerSnackbarContent( message: _mapErrorMessage(data.displayException), title: options.errorTitle, ), @@ -43,7 +43,7 @@ class TalkerWrapper extends StatelessWidget { showAlert( context, options.errorAlertBuilder?.call(context, data) ?? - SnackbarContent( + TalkerSnackbarContent( message: _mapErrorMessage(data.displayError), title: options.errorTitle, ), diff --git a/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart deleted file mode 100644 index e32a6f8af..000000000 --- a/packages/talker_flutter/lib/src/ui/widgets/bottom_sheet.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:talker_flutter/talker_flutter.dart'; - -class BaseBottomSheet extends StatelessWidget { - const BaseBottomSheet({ - Key? key, - required this.talkerScreenTheme, - required this.child, - required this.title, - }) : super(key: key); - - final TalkerScreenTheme talkerScreenTheme; - final Widget child; - final String title; - - @override - Widget build(BuildContext context) { - final mq = MediaQuery.of(context); - final theme = Theme.of(context); - return SafeArea( - bottom: false, - child: Container( - margin: EdgeInsets.only( - top: mq.padding.top + mq.viewInsets.top + 50, - ), - padding: EdgeInsets.only( - top: 20, - bottom: mq.padding.bottom, - ), - decoration: BoxDecoration( - color: talkerScreenTheme.backgroundColor, - borderRadius: BorderRadius.circular(16), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8) - .copyWith(bottom: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - title, - style: theme.textTheme.headlineSmall - ?.copyWith(color: talkerScreenTheme.textColor), - ), - InkWell( - onTap: () => Navigator.pop(context), - child: Icon( - Icons.close_rounded, - color: talkerScreenTheme.textColor, - ), - ), - ], - ), - ), - // Divider( - // color: talkerScreenTheme.textColor, - // endIndent: 10, - // indent: 10, - // height: 1, - // ), - child, - ], - ), - ), - ); - } -} diff --git a/packages/talker_flutter/lib/src/ui/widgets/talker_base_bottom_sheet.dart b/packages/talker_flutter/lib/src/ui/widgets/talker_base_bottom_sheet.dart new file mode 100644 index 000000000..aa7b98cbc --- /dev/null +++ b/packages/talker_flutter/lib/src/ui/widgets/talker_base_bottom_sheet.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:talker_flutter/talker_flutter.dart'; + +class TalkerBaseBottomSheet extends StatelessWidget { + const TalkerBaseBottomSheet({ + Key? key, + required this.talkerScreenTheme, + required this.child, + required this.title, + this.heightFactor, + }) : super(key: key); + + final TalkerScreenTheme talkerScreenTheme; + final Widget child; + final String title; + final double? heightFactor; + + @override + Widget build(BuildContext context) { + final mq = MediaQuery.of(context); + final theme = Theme.of(context); + return Padding( + padding: EdgeInsets.only(bottom: mq.viewInsets.bottom), + child: FractionallySizedBox( + heightFactor: heightFactor, + child: SafeArea( + bottom: false, + child: Container( + margin: EdgeInsets.only( + top: mq.padding.top + mq.viewInsets.top + 50, + ), + padding: EdgeInsets.only(top: 20, + bottom: mq.padding.bottom + 20), + decoration: BoxDecoration( + color: talkerScreenTheme.backgroundColor, + borderRadius: BorderRadius.circular(16), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8) + .copyWith(bottom: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: theme.textTheme.headlineSmall + ?.copyWith(color: talkerScreenTheme.textColor), + ), + InkWell( + onTap: () => Navigator.pop(context), + child: Icon( + Icons.close_rounded, + color: talkerScreenTheme.textColor, + ), + ), + ], + ), + ), + // Divider( + // color: talkerScreenTheme.textColor, + // endIndent: 10, + // indent: 10, + // height: 1, + // ), + child, + ], + ), + ), + ), + ), + ); + } +} diff --git a/packages/talker_flutter/lib/src/ui/widgets/base_card.dart b/packages/talker_flutter/lib/src/ui/widgets/talker_base_card.dart similarity index 100% rename from packages/talker_flutter/lib/src/ui/widgets/base_card.dart rename to packages/talker_flutter/lib/src/ui/widgets/talker_base_card.dart diff --git a/packages/talker_flutter/lib/src/ui/widgets/data_card.dart b/packages/talker_flutter/lib/src/ui/widgets/talker_data_card.dart similarity index 98% rename from packages/talker_flutter/lib/src/ui/widgets/data_card.dart rename to packages/talker_flutter/lib/src/ui/widgets/talker_data_card.dart index b3feb5695..97ea134a3 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/data_card.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/talker_data_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:talker_flutter/src/ui/theme/default_theme.dart'; -import 'package:talker_flutter/src/ui/widgets/base_card.dart'; +import 'package:talker_flutter/src/ui/widgets/talker_base_card.dart'; import 'package:talker_flutter/talker_flutter.dart'; class TalkerDataCard extends StatefulWidget { diff --git a/packages/talker_flutter/lib/src/ui/widgets/snackbar.dart b/packages/talker_flutter/lib/src/ui/widgets/talker_snackbar_content.dart similarity index 96% rename from packages/talker_flutter/lib/src/ui/widgets/snackbar.dart rename to packages/talker_flutter/lib/src/ui/widgets/talker_snackbar_content.dart index 6326f8e38..1d3552c79 100644 --- a/packages/talker_flutter/lib/src/ui/widgets/snackbar.dart +++ b/packages/talker_flutter/lib/src/ui/widgets/talker_snackbar_content.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -class SnackbarContent extends StatelessWidget { - const SnackbarContent({ +class TalkerSnackbarContent extends StatelessWidget { + const TalkerSnackbarContent({ Key? key, required this.message, required this.title, diff --git a/packages/talker_flutter/pubspec.yaml b/packages/talker_flutter/pubspec.yaml index 520ea079f..e54f41271 100644 --- a/packages/talker_flutter/pubspec.yaml +++ b/packages/talker_flutter/pubspec.yaml @@ -23,12 +23,12 @@ dependencies: talker: ^4.5.3 group_button: ^5.3.4 path_provider: ^2.1.4 - share_plus: ^10.0.1 + share_plus: ^10.0.2 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^5.0.0 flutter: diff --git a/packages/talker_http_logger/lib/talker_http_logger.dart b/packages/talker_http_logger/lib/talker_http_logger.dart index 71dff7597..86b79c3c0 100644 --- a/packages/talker_http_logger/lib/talker_http_logger.dart +++ b/packages/talker_http_logger/lib/talker_http_logger.dart @@ -54,7 +54,8 @@ class HttpRequestLog extends TalkerLog { String get key => TalkerLogType.httpRequest.key; @override - String generateTextMessage({TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${request.method}] $message'; final headers = request.headers; @@ -86,7 +87,8 @@ class HttpResponseLog extends TalkerLog { String get key => TalkerLogType.httpResponse.key; @override - String generateTextMessage({TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${response.request?.method}] $message'; final headers = response.request?.headers; @@ -120,7 +122,8 @@ class HttpErrorLog extends TalkerLog { String get key => TalkerLogType.httpError.key; @override - String generateTextMessage({TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${response.request?.method}] $message'; final headers = response.request?.headers; diff --git a/packages/talker_http_logger/pubspec.yaml b/packages/talker_http_logger/pubspec.yaml index f5681d466..14a909247 100644 --- a/packages/talker_http_logger/pubspec.yaml +++ b/packages/talker_http_logger/pubspec.yaml @@ -11,5 +11,5 @@ dependencies: talker: ^4.5.3 dev_dependencies: - lints: ^2.0.0 - test: ^1.21.0 + lints: ^5.0.0 + test: ^1.25.8 diff --git a/packages/talker_logger/pubspec.yaml b/packages/talker_logger/pubspec.yaml index ef5c5257a..d674b82e6 100644 --- a/packages/talker_logger/pubspec.yaml +++ b/packages/talker_logger/pubspec.yaml @@ -16,8 +16,8 @@ environment: sdk: '>=2.15.0 <4.0.0' dependencies: - ansicolor: ^2.0.2 + ansicolor: ^2.0.3 dev_dependencies: - lint: ^2.1.2 - test: ^1.24.9 + lint: ^2.3.0 + test: ^1.25.8 diff --git a/utils/deploy_web.sh b/utils/deploy_web.sh old mode 100644 new mode 100755 diff --git a/utils/pub_clean_all.sh b/utils/pub_clean_all.sh old mode 100644 new mode 100755 diff --git a/utils/pub_get_all.sh b/utils/pub_get_all.sh old mode 100644 new mode 100755 diff --git a/utils/pub_get_all_offline.sh b/utils/pub_get_all_offline.sh old mode 100644 new mode 100755 diff --git a/utils/publish_all.sh b/utils/publish_all.sh old mode 100644 new mode 100755