├── .tokeignore ├── flutter ├── ios │ ├── Runner │ │ ├── Runner-Bridging-Header.h │ │ ├── Assets.xcassets │ │ │ ├── LaunchImage.imageset │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ ├── README.md │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ │ └── Contents.json │ │ ├── AppDelegate.swift │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Flutter │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ ├── Flutter.podspec │ │ └── AppFrameworkInfo.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── RunnerTests │ │ └── RunnerTests.swift │ ├── .gitignore │ ├── Podfile │ └── Podfile.lock ├── lib │ ├── pages │ │ ├── pages.dart │ │ ├── landmarks │ │ │ ├── models │ │ │ │ ├── models.dart │ │ │ │ ├── data.dart │ │ │ │ ├── landmark.dart │ │ │ │ ├── data.g.dart │ │ │ │ ├── user_data.dart │ │ │ │ ├── landmark.g.dart │ │ │ │ ├── user_data.g.dart │ │ │ │ └── landmark.freezed.dart │ │ │ ├── detail │ │ │ │ ├── map_view.dart │ │ │ │ ├── circle_image.dart │ │ │ │ ├── landmark_detail.dart │ │ │ │ └── content.dart │ │ │ ├── landmark_row.dart │ │ │ └── landmarks_page.dart │ │ └── home │ │ │ └── home_page.dart │ └── main.dart ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ ├── Icon-512.png │ │ ├── Icon-maskable-192.png │ │ └── Icon-maskable-512.png │ ├── manifest.json │ └── index.html ├── assets │ ├── icybay.jpg │ ├── umbagog.jpg │ ├── twinlake.jpg │ ├── chincoteague.jpg │ ├── hiddenlake.jpg │ ├── lakemcdonald.jpg │ ├── rainbowlake.jpg │ ├── stmarylake.jpg │ ├── turtlerock.jpg │ ├── charleyrivers.jpg │ ├── chilkoottrail.jpg │ ├── silversalmoncreek.jpg │ ├── yukon_charleyrivers.jpg │ └── landmarkData.json ├── android │ ├── gradle.properties │ ├── app │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night │ │ │ │ │ │ └── styles.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── mono0926 │ │ │ │ │ │ └── swiftui_flutter │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── AndroidManifest.xml │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── .gitignore │ ├── settings.gradle │ └── build.gradle ├── macos │ ├── Runner │ │ ├── Configs │ │ │ ├── Debug.xcconfig │ │ │ ├── Release.xcconfig │ │ │ ├── Warnings.xcconfig │ │ │ └── AppInfo.xcconfig │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── app_icon_16.png │ │ │ │ ├── app_icon_32.png │ │ │ │ ├── app_icon_64.png │ │ │ │ ├── app_icon_1024.png │ │ │ │ ├── app_icon_128.png │ │ │ │ ├── app_icon_256.png │ │ │ │ ├── app_icon_512.png │ │ │ │ └── Contents.json │ │ ├── AppDelegate.swift │ │ ├── Release.entitlements │ │ ├── DebugProfile.entitlements │ │ ├── MainFlutterWindow.swift │ │ ├── Info.plist │ │ └── Base.lproj │ │ │ └── MainMenu.xib │ ├── .gitignore │ ├── Flutter │ │ ├── Flutter-Debug.xcconfig │ │ ├── Flutter-Release.xcconfig │ │ └── GeneratedPluginRegistrant.swift │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ └── project.pbxproj │ ├── RunnerTests │ │ └── RunnerTests.swift │ └── Podfile ├── analysis_options.yaml ├── build.yaml ├── README.md ├── pubspec.yaml ├── .gitignore ├── test │ └── widget_test.dart └── .metadata ├── screenshots ├── SwiftUI.png └── Flutter.jpeg ├── swiftui ├── swiftuiFlutter │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── turtlerock.imageset │ │ │ ├── turtlerock.jpg │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── Landmarks │ │ ├── Resources │ │ │ ├── icybay.jpg │ │ │ ├── twinlake.jpg │ │ │ ├── umbagog.jpg │ │ │ ├── hiddenlake.jpg │ │ │ ├── rainbowlake.jpg │ │ │ ├── stmarylake.jpg │ │ │ ├── turtlerock.jpg │ │ │ ├── charleyrivers.jpg │ │ │ ├── chilkoottrail.jpg │ │ │ ├── chincoteague.jpg │ │ │ ├── lakemcdonald.jpg │ │ │ ├── silversalmoncreek.jpg │ │ │ ├── yukon_charleyrivers.jpg │ │ │ └── landmarkData.json │ │ ├── Models │ │ │ ├── UserData.swift │ │ │ ├── Landmark.swift │ │ │ └── Data.swift │ │ ├── Supporting Views │ │ │ ├── CircleImage.swift │ │ │ └── MapView.swift │ │ ├── LandmarkRow.swift │ │ ├── LandmarkList.swift │ │ └── LandmarkDetail.swift │ ├── ContentView.swift │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── AppDelegate.swift │ ├── Info.plist │ └── SceneDelegate.swift ├── swiftuiFlutter.xcodeproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── .gitignore ├── README.md └── LICENSE /.tokeignore: -------------------------------------------------------------------------------- 1 | *.freezed.dart 2 | *.g.dart 3 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /flutter/lib/pages/pages.dart: -------------------------------------------------------------------------------- 1 | export 'home/home_page.dart'; 2 | export 'landmarks/landmarks_page.dart'; 3 | -------------------------------------------------------------------------------- /flutter/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/web/favicon.png -------------------------------------------------------------------------------- /screenshots/SwiftUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/screenshots/SwiftUI.png -------------------------------------------------------------------------------- /flutter/assets/icybay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/icybay.jpg -------------------------------------------------------------------------------- /flutter/assets/umbagog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/umbagog.jpg -------------------------------------------------------------------------------- /screenshots/Flutter.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/screenshots/Flutter.jpeg -------------------------------------------------------------------------------- /flutter/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /flutter/assets/twinlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/twinlake.jpg -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/models.dart: -------------------------------------------------------------------------------- 1 | export 'data.dart'; 2 | export 'landmark.dart'; 3 | export 'user_data.dart'; 4 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/assets/chincoteague.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/chincoteague.jpg -------------------------------------------------------------------------------- /flutter/assets/hiddenlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/hiddenlake.jpg -------------------------------------------------------------------------------- /flutter/assets/lakemcdonald.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/lakemcdonald.jpg -------------------------------------------------------------------------------- /flutter/assets/rainbowlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/rainbowlake.jpg -------------------------------------------------------------------------------- /flutter/assets/stmarylake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/stmarylake.jpg -------------------------------------------------------------------------------- /flutter/assets/turtlerock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/turtlerock.jpg -------------------------------------------------------------------------------- /flutter/macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/xcuserdata/ 7 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/web/icons/Icon-192.png -------------------------------------------------------------------------------- /flutter/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/web/icons/Icon-512.png -------------------------------------------------------------------------------- /flutter/assets/charleyrivers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/charleyrivers.jpg -------------------------------------------------------------------------------- /flutter/assets/chilkoottrail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/chilkoottrail.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /flutter/assets/silversalmoncreek.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/silversalmoncreek.jpg -------------------------------------------------------------------------------- /flutter/assets/yukon_charleyrivers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/assets/yukon_charleyrivers.jpg -------------------------------------------------------------------------------- /flutter/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /flutter/web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /flutter/web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /flutter/macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/icybay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/icybay.jpg -------------------------------------------------------------------------------- /flutter/macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/twinlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/twinlake.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/umbagog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/umbagog.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/hiddenlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/hiddenlake.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/rainbowlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/rainbowlake.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/stmarylake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/stmarylake.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/turtlerock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/turtlerock.jpg -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/charleyrivers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/charleyrivers.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/chilkoottrail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/chilkoottrail.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/chincoteague.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/chincoteague.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/lakemcdonald.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/lakemcdonald.jpg -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/silversalmoncreek.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/silversalmoncreek.jpg -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/yukon_charleyrivers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Landmarks/Resources/yukon_charleyrivers.jpg -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Assets.xcassets/turtlerock.imageset/turtlerock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/swiftui/swiftuiFlutter/Assets.xcassets/turtlerock.imageset/turtlerock.jpg -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mono0926/swiftui-flutter-comparison/HEAD/flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /flutter/android/app/src/main/kotlin/com/mono0926/swiftui_flutter/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.mono0926.swiftui_flutter 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # swiftui-flutter-comparison 2 | 3 | ## [SwiftUI Essentials](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views) 4 | 5 | SwiftUI | Flutter 6 | --- | --- 7 | ![](screenshots/SwiftUI.png) | ![](screenshots/Flutter.jpeg) 8 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /flutter/macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /flutter/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /flutter/ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /flutter/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # https://pub.dev/packages/pedantic_mono 2 | include: package:pedantic_mono/analysis_options.yaml 3 | analyzer: 4 | errors: 5 | # https://github.com/rrousselGit/freezed/issues/488 6 | invalid_annotation_target: ignore 7 | # riverpod_generatorの影響でg.dart末尾に不要な指定が付くので 8 | duplicate_ignore: ignore 9 | plugins: 10 | - custom_lint 11 | -------------------------------------------------------------------------------- /flutter/macos/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import FlutterMacOS 2 | import Cocoa 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | 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. -------------------------------------------------------------------------------- /flutter/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /flutter/macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Assets.xcassets/turtlerock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "turtlerock.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /flutter/macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /flutter/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/data.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter/services.dart'; 4 | import 'package:riverpod_annotation/riverpod_annotation.dart'; 5 | 6 | import 'models.dart'; 7 | 8 | part 'data.g.dart'; 9 | 10 | @riverpod 11 | Future> landmarkData(LandmarkDataRef ref) async { 12 | final json = await rootBundle.loadString('assets/landmarkData.json'); 13 | final decoded = (jsonDecode(json) as List).cast>(); 14 | return decoded.map(Landmark.fromJson).toList(); 15 | } 16 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /flutter/build.yaml: -------------------------------------------------------------------------------- 1 | targets: 2 | $default: 3 | builders: 4 | json_serializable: 5 | options: 6 | any_map: true 7 | explicit_to_json: true 8 | source_gen|combining_builder: 9 | options: 10 | ignore_for_file: 11 | - type=lint 12 | - implicit_dynamic_parameter 13 | - implicit_dynamic_type 14 | - implicit_dynamic_method 15 | - strict_raw_type 16 | riverpod_generator: 17 | options: 18 | provider_family_name_suffix: 'ProviderFamily' 19 | -------------------------------------------------------------------------------- /flutter/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | import GoogleMaps 4 | 5 | @UIApplicationMain 6 | @objc class AppDelegate: FlutterAppDelegate { 7 | override func application( 8 | _ application: UIApplication, 9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 10 | ) -> Bool { 11 | GMSServices.provideAPIKey("AIzaSyC4kIYZL9ttRi0fzcjL9kJULF09Nd-P-PE") 12 | GeneratedPluginRegistrant.register(with: self) 13 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/detail/map_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 3 | 4 | class MapView extends StatelessWidget { 5 | const MapView({ 6 | super.key, 7 | required this.latLng, 8 | }); 9 | 10 | final LatLng latLng; 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return GoogleMap( 15 | myLocationButtonEnabled: false, 16 | initialCameraPosition: CameraPosition( 17 | target: latLng, 18 | zoom: 7.5, 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /flutter/README.md: -------------------------------------------------------------------------------- 1 | # swiftui_flutter 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Models/UserData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserData.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/07. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | import Combine 12 | 13 | final class UserData: BindableObject { 14 | 15 | let didChange = PassthroughSubject() 16 | 17 | var showFavoritesOnly = false { 18 | didSet { 19 | didChange.send(self) 20 | } 21 | } 22 | 23 | var landmarks = landmarkData { 24 | didSet { 25 | didChange.send(self) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = swiftui_flutter 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.mono0926.swiftuiFlutter 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2021 com.mono0926. All rights reserved. 15 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Supporting Views/CircleImage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CircleImage.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct CircleImage: View { 12 | var image: Image 13 | 14 | var body: some View { 15 | image 16 | .clipShape(Circle()) 17 | .overlay(Circle().stroke(Color.white, lineWidth: 4)) 18 | .shadow(radius: 10) 19 | } 20 | } 21 | 22 | #if DEBUG 23 | struct CircleImage_Previews: PreviewProvider { 24 | static var previews: some View { 25 | CircleImage(image: Image("turtlerock")) 26 | } 27 | } 28 | #endif 29 | -------------------------------------------------------------------------------- /flutter/ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /flutter/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.3.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | tasks.register("clean", Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /flutter/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: swiftui_flutter 2 | description: SwiftUI / Flutter Comparison https://developer.apple.com/tutorials/swiftui/creating-and-combining-views 3 | version: 1.0.0+1 4 | environment: 5 | sdk: '>=3.0.0 <4.0.0' 6 | dependencies: 7 | adaptive_dialog: ^1.9.0-0 8 | cupertino_icons: 9 | flutter: 10 | sdk: flutter 11 | flutter_riverpod: 12 | freezed_annotation: 13 | google_maps_flutter: 14 | mono_kit: 15 | provider: 16 | riverpod_annotation: 17 | route_observer_mixin: 18 | dev_dependencies: 19 | build_runner: 20 | custom_lint: 21 | flutter_test: 22 | sdk: flutter 23 | freezed: 24 | json_serializable: 25 | pedantic_mono: 26 | riverpod_generator: 27 | riverpod_lint: 28 | flutter: 29 | uses-material-design: true 30 | assets: 31 | - assets/ 32 | -------------------------------------------------------------------------------- /flutter/macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import dynamic_color 9 | import file_selector_macos 10 | import macos_ui 11 | import macos_window_utils 12 | import url_launcher_macos 13 | 14 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 15 | DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) 16 | FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) 17 | MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin")) 18 | MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) 19 | UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) 20 | } 21 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/Flutter.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # This podspec is NOT to be published. It is only used as a local source! 3 | # This is a generated file; do not edit or check into version control. 4 | # 5 | 6 | Pod::Spec.new do |s| 7 | s.name = 'Flutter' 8 | s.version = '1.0.0' 9 | s.summary = 'A UI toolkit for beautiful and fast apps.' 10 | s.homepage = 'https://flutter.dev' 11 | s.license = { :type => 'BSD' } 12 | s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } 13 | s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } 14 | s.ios.deployment_target = '11.0' 15 | # Framework linking is handled by Flutter tooling, not CocoaPods. 16 | # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. 17 | s.vendored_frameworks = 'path/to/nothing' 18 | end 19 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ContentView : View { 12 | @EnvironmentObject var userData: UserData 13 | 14 | var body: some View { 15 | NavigationView { 16 | List { 17 | NavigationButton(destination: LandmarkList()) { 18 | HStack { 19 | Text("Landmarks") 20 | } 21 | } 22 | } 23 | .navigationBarTitle(Text("SwiftUI"), displayMode: .inline) 24 | } 25 | } 26 | } 27 | 28 | #if DEBUG 29 | struct ContentView_Previews : PreviewProvider { 30 | static var previews: some View { 31 | ContentView() 32 | } 33 | } 34 | #endif 35 | -------------------------------------------------------------------------------- /flutter/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/detail/circle_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CircleImage extends StatelessWidget { 4 | const CircleImage({ 5 | super.key, 6 | required this.imageName, 7 | }); 8 | 9 | final String imageName; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Container( 14 | width: 250, 15 | height: 250, 16 | decoration: BoxDecoration( 17 | border: Border.all( 18 | width: 4, 19 | color: Colors.white, 20 | ), 21 | borderRadius: BorderRadius.circular(1000), 22 | boxShadow: [ 23 | BoxShadow( 24 | color: Colors.black.withOpacity(0.33), 25 | blurRadius: 10, 26 | ), 27 | ], 28 | ), 29 | child: ClipOval( 30 | child: Image.asset('assets/$imageName.jpg'), 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/detail/landmark_detail.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | import 'package:swiftui_flutter/pages/landmarks/models/models.dart'; 4 | 5 | import 'content.dart'; 6 | 7 | final selectedLandmarkId = StateProvider((ref) => null); 8 | 9 | class LandmarkDetail extends ConsumerWidget { 10 | const LandmarkDetail({super.key}); 11 | 12 | static const routeName = 'LandmarkDetail'; 13 | @override 14 | Widget build(BuildContext context, WidgetRef ref) { 15 | final id = ref.watch(selectedLandmarkId)!; 16 | final landmark = ref.watch(landmarkProviderFamily(id)).value!; 17 | return CupertinoPageScaffold( 18 | navigationBar: CupertinoNavigationBar( 19 | middle: Text(landmark.name), 20 | ), 21 | child: const SafeArea( 22 | child: Content(), 23 | ), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /flutter/lib/pages/home/home_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | import '../pages.dart'; 4 | 5 | class HomePage extends StatelessWidget { 6 | const HomePage({super.key}); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return CupertinoPageScaffold( 11 | navigationBar: const CupertinoNavigationBar( 12 | middle: Text('Flutter'), 13 | ), 14 | child: CupertinoListSection( 15 | topMargin: 0, 16 | children: [ 17 | for (final routeName in [ 18 | LandmarksPage.routeName, 19 | ]) 20 | CupertinoListTile( 21 | onTap: () => Navigator.of(context).pushNamed(routeName), 22 | title: Text( 23 | routeName.replaceAll('/', ''), 24 | ), 25 | trailing: const CupertinoListTileChevron(), 26 | ), 27 | ], 28 | ), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Supporting Views/MapView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapView.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import MapKit 11 | 12 | struct MapView: UIViewRepresentable { 13 | var coordinate: CLLocationCoordinate2D 14 | 15 | func makeUIView(context: Context) -> MKMapView { 16 | MKMapView(frame: .zero) 17 | } 18 | 19 | func updateUIView(_ view: MKMapView, context: Context) { 20 | let span = MKCoordinateSpan(latitudeDelta: 2, longitudeDelta: 2) 21 | let region = MKCoordinateRegion(center: coordinate, span: span) 22 | view.setRegion(region, animated: true) 23 | } 24 | } 25 | 26 | #if DEBUG 27 | struct MapView_Previews: PreviewProvider { 28 | static var previews: some View { 29 | MapView(coordinate: landmarkData[0].locationCoordinate) 30 | } 31 | } 32 | #endif 33 | -------------------------------------------------------------------------------- /flutter/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Exceptions to above rules. 44 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 45 | 46 | vendor/ 47 | 48 | **/fastlane/report.xml 49 | .fvm/flutter_sdk -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/landmark.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | import 'package:google_maps_flutter/google_maps_flutter.dart'; 3 | 4 | part 'landmark.freezed.dart'; 5 | part 'landmark.g.dart'; 6 | 7 | @freezed 8 | class Landmark with _$Landmark { 9 | factory Landmark({ 10 | required int id, 11 | required String name, 12 | required String imageName, 13 | required String state, 14 | required String park, 15 | required Coordinates coordinates, 16 | }) = _Landmark; 17 | Landmark._(); 18 | 19 | factory Landmark.fromJson(Map json) => 20 | _$LandmarkFromJson(json); 21 | 22 | late final LatLng latLng = LatLng( 23 | coordinates.latitude, 24 | coordinates.longitude, 25 | ); 26 | } 27 | 28 | @freezed 29 | class Coordinates with _$Coordinates { 30 | const factory Coordinates( 31 | {required double latitude, required double longitude,}) = _Coordinates; 32 | factory Coordinates.fromJson(Map json) => 33 | _$CoordinatesFromJson(json); 34 | } 35 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/LandmarkRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LandmarkRow.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct LandmarkRow: View { 12 | var landmark: Landmark 13 | 14 | var body: some View { 15 | HStack { 16 | landmark.image(forSize: 50) 17 | Text(verbatim: landmark.name) 18 | Spacer() 19 | 20 | if landmark.isFavorite { 21 | Image(systemName: "star.fill") 22 | .imageScale(.medium) 23 | .foregroundColor(.yellow) 24 | } 25 | } 26 | } 27 | } 28 | 29 | #if DEBUG 30 | struct LandmarkRow_Previews: PreviewProvider { 31 | static var previews: some View { 32 | Group { 33 | LandmarkRow(landmark: landmarkData[0]) 34 | LandmarkRow(landmark: landmarkData[1]) 35 | } 36 | .previewLayout(.fixed(width: 300, height: 70)) 37 | } 38 | } 39 | #endif 40 | 41 | -------------------------------------------------------------------------------- /flutter/web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swiftui_flutter", 3 | "short_name": "swiftui_flutter", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Masayuki Ono 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/data.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | // ignore_for_file: type=lint, implicit_dynamic_parameter, implicit_dynamic_type, implicit_dynamic_method, strict_raw_type 4 | 5 | part of 'data.dart'; 6 | 7 | // ************************************************************************** 8 | // RiverpodGenerator 9 | // ************************************************************************** 10 | 11 | String _$landmarkDataHash() => r'70392ee745813ca2a1d1a88c42990ada141a5938'; 12 | 13 | /// See also [landmarkData]. 14 | @ProviderFor(landmarkData) 15 | final landmarkDataProvider = AutoDisposeFutureProvider>.internal( 16 | landmarkData, 17 | name: r'landmarkDataProvider', 18 | debugGetCreateSourceHash: 19 | const bool.fromEnvironment('dart.vm.product') ? null : _$landmarkDataHash, 20 | dependencies: null, 21 | allTransitiveDependencies: null, 22 | ); 23 | 24 | typedef LandmarkDataRef = AutoDisposeFutureProviderRef>; 25 | // ignore_for_file: type=lint 26 | // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member 27 | -------------------------------------------------------------------------------- /flutter/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | import 'package:swiftui_flutter/main.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(const App()); 16 | 17 | // Verify that our counter starts at 0. 18 | expect(find.text('0'), findsOneWidget); 19 | expect(find.text('1'), findsNothing); 20 | 21 | // Tap the '+' icon and trigger a frame. 22 | await tester.tap(find.byIcon(Icons.add)); 23 | await tester.pump(); 24 | 25 | // Verify that our counter has incremented. 26 | expect(find.text('0'), findsNothing); 27 | expect(find.text('1'), findsOneWidget); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/LandmarkList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LandmarkList.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct LandmarkList: View { 12 | @EnvironmentObject var userData: UserData 13 | 14 | var body: some View { 15 | List { 16 | 17 | Toggle(isOn: $userData.showFavoritesOnly) { 18 | Text("Favorites only") 19 | } 20 | 21 | ForEach(userData.landmarks) { landmark in 22 | if !self.userData.showFavoritesOnly || landmark.isFavorite { 23 | NavigationButton(destination: LandmarkDetail(landmark: landmark)) { 24 | LandmarkRow(landmark: landmark) 25 | } 26 | } 27 | } 28 | } 29 | .navigationBarTitle(Text("Landmarks"), displayMode: .large) 30 | } 31 | } 32 | 33 | #if DEBUG 34 | struct LandmarkList_Previews: PreviewProvider { 35 | static var previews: some View { 36 | LandmarkList() 37 | .environmentObject(UserData()) 38 | } 39 | } 40 | #endif 41 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | $(PRODUCT_COPYRIGHT) 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Models/Landmark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Landmark.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import CoreLocation 11 | 12 | struct Landmark: Hashable, Codable, Identifiable { 13 | var id: Int 14 | var name: String 15 | fileprivate var imageName: String 16 | fileprivate var coordinates: Coordinates 17 | var state: String 18 | var park: String 19 | var category: Category 20 | var isFavorite: Bool 21 | 22 | var locationCoordinate: CLLocationCoordinate2D { 23 | CLLocationCoordinate2D( 24 | latitude: coordinates.latitude, 25 | longitude: coordinates.longitude) 26 | } 27 | 28 | func image(forSize size: Int) -> Image { 29 | ImageStore.shared.image(name: imageName, size: size) 30 | } 31 | 32 | enum Category: String, CaseIterable, Codable, Hashable { 33 | case featured = "Featured" 34 | case lakes = "Lakes" 35 | case rivers = "Rivers" 36 | case mountains = "Mountains" 37 | } 38 | } 39 | 40 | struct Coordinates: Hashable, Codable { 41 | var latitude: Double 42 | var longitude: Double 43 | } 44 | 45 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/user_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:riverpod_annotation/riverpod_annotation.dart'; 2 | 3 | import 'models.dart'; 4 | 5 | part 'user_data.g.dart'; 6 | 7 | @riverpod 8 | class ShowFavoritesOnly extends _$ShowFavoritesOnly { 9 | @override 10 | bool build() => false; 11 | 12 | void toggle() => state = !state; 13 | } 14 | 15 | @riverpod 16 | class Favorite extends _$Favorite { 17 | // TODO(mono): freezed化 18 | @override 19 | Map build() => {}; 20 | 21 | void update({required int id, required bool isFavorite}) { 22 | state = { 23 | ...state, 24 | id: isFavorite, 25 | }; 26 | } 27 | } 28 | 29 | @riverpod 30 | bool isFavorite(IsFavoriteRef ref, int id) { 31 | final favoriteMap = ref.watch(favoriteProvider); 32 | return favoriteMap.containsKey(id); 33 | } 34 | 35 | @riverpod 36 | FutureOr landmark(LandmarkRef ref, int id) async => 37 | (await ref.watch(landmarkDataProvider.future)) 38 | .firstWhere((l) => l.id == id); 39 | 40 | @riverpod 41 | Future> landmarkList(LandmarkListRef ref) async { 42 | final landmarks = await ref.watch(landmarkDataProvider.future); 43 | final favoriteMap = ref.watch(favoriteProvider); 44 | 45 | return ref.watch(showFavoritesOnlyProvider) 46 | ? landmarks.where((l) => favoriteMap.containsKey(l.id)).toList() 47 | : landmarks; 48 | } 49 | -------------------------------------------------------------------------------- /flutter/macos/Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.11' 2 | 3 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 4 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 5 | 6 | project 'Runner', { 7 | 'Debug' => :debug, 8 | 'Profile' => :release, 9 | 'Release' => :release, 10 | } 11 | 12 | def flutter_root 13 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) 14 | unless File.exist?(generated_xcode_build_settings_path) 15 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" 16 | end 17 | 18 | File.foreach(generated_xcode_build_settings_path) do |line| 19 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 20 | return matches[1].strip if matches 21 | end 22 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" 23 | end 24 | 25 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 26 | 27 | flutter_macos_podfile_setup 28 | 29 | target 'Runner' do 30 | use_frameworks! 31 | use_modular_headers! 32 | 33 | flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) 34 | end 35 | 36 | post_install do |installer| 37 | installer.pods_project.targets.each do |target| 38 | flutter_additional_macos_build_settings(target) 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/landmark.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | // ignore_for_file: type=lint, implicit_dynamic_parameter, implicit_dynamic_type, implicit_dynamic_method, strict_raw_type 4 | 5 | part of 'landmark.dart'; 6 | 7 | // ************************************************************************** 8 | // JsonSerializableGenerator 9 | // ************************************************************************** 10 | 11 | _$_Landmark _$$_LandmarkFromJson(Map json) => _$_Landmark( 12 | id: json['id'] as int, 13 | name: json['name'] as String, 14 | imageName: json['imageName'] as String, 15 | state: json['state'] as String, 16 | park: json['park'] as String, 17 | coordinates: Coordinates.fromJson( 18 | Map.from(json['coordinates'] as Map)), 19 | ); 20 | 21 | Map _$$_LandmarkToJson(_$_Landmark instance) => 22 | { 23 | 'id': instance.id, 24 | 'name': instance.name, 25 | 'imageName': instance.imageName, 26 | 'state': instance.state, 27 | 'park': instance.park, 28 | 'coordinates': instance.coordinates.toJson(), 29 | }; 30 | 31 | _$_Coordinates _$$_CoordinatesFromJson(Map json) => _$_Coordinates( 32 | latitude: (json['latitude'] as num).toDouble(), 33 | longitude: (json['longitude'] as num).toDouble(), 34 | ); 35 | 36 | Map _$$_CoordinatesToJson(_$_Coordinates instance) => 37 | { 38 | 'latitude': instance.latitude, 39 | 'longitude': instance.longitude, 40 | }; 41 | -------------------------------------------------------------------------------- /flutter/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '11.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | target 'RunnerTests' do 36 | inherit! :search_paths 37 | end 38 | end 39 | 40 | post_install do |installer| 41 | installer.pods_project.targets.each do |target| 42 | flutter_additional_ios_build_settings(target) 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/landmark_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 4 | 5 | import 'detail/landmark_detail.dart'; 6 | import 'models/models.dart'; 7 | 8 | class LandmarkRow extends ConsumerWidget { 9 | LandmarkRow({ 10 | required this.id, 11 | }) : super(key: ValueKey(id)); 12 | 13 | final int id; 14 | 15 | @override 16 | Widget build(BuildContext context, WidgetRef ref) { 17 | final landmark = ref.watch(landmarkProviderFamily(id)).value; 18 | return landmark == null 19 | ? const SizedBox.shrink() 20 | : CupertinoListTile( 21 | onTap: () { 22 | ref.read(selectedLandmarkId.notifier).state = id; 23 | Navigator.of(context).push( 24 | CupertinoPageRoute( 25 | title: LandmarkDetail.routeName, 26 | builder: (context) { 27 | return const LandmarkDetail(); 28 | }, 29 | ), 30 | ); 31 | }, 32 | leading: Image.asset('assets/${landmark.imageName}.jpg'), 33 | leadingSize: 50, 34 | trailing: Row( 35 | children: [ 36 | if (ref 37 | .watch(favoriteProvider.select((s) => s.containsKey(id)))) 38 | Icon( 39 | Icons.star, 40 | color: Colors.yellow[700], 41 | ), 42 | const CupertinoListTileChevron(), 43 | ], 44 | ), 45 | title: Text(landmark.name), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /flutter/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - google_maps_flutter_ios (0.0.1): 4 | - Flutter 5 | - GoogleMaps (< 8.0) 6 | - GoogleMaps (5.2.0): 7 | - GoogleMaps/Maps (= 5.2.0) 8 | - GoogleMaps/Base (5.2.0) 9 | - GoogleMaps/Maps (5.2.0): 10 | - GoogleMaps/Base 11 | - image_picker_ios (0.0.1): 12 | - Flutter 13 | - mono_kit (0.0.1): 14 | - Flutter 15 | - url_launcher_ios (0.0.1): 16 | - Flutter 17 | 18 | DEPENDENCIES: 19 | - Flutter (from `Flutter`) 20 | - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) 21 | - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) 22 | - mono_kit (from `.symlinks/plugins/mono_kit/ios`) 23 | - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) 24 | 25 | SPEC REPOS: 26 | trunk: 27 | - GoogleMaps 28 | 29 | EXTERNAL SOURCES: 30 | Flutter: 31 | :path: Flutter 32 | google_maps_flutter_ios: 33 | :path: ".symlinks/plugins/google_maps_flutter_ios/ios" 34 | image_picker_ios: 35 | :path: ".symlinks/plugins/image_picker_ios/ios" 36 | mono_kit: 37 | :path: ".symlinks/plugins/mono_kit/ios" 38 | url_launcher_ios: 39 | :path: ".symlinks/plugins/url_launcher_ios/ios" 40 | 41 | SPEC CHECKSUMS: 42 | Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 43 | google_maps_flutter_ios: abdac20d6ce8931f6ebc5f46616df241bfaa2cfd 44 | GoogleMaps: 025272d5876d3b32604e5c080dc25eaf68764693 45 | image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 46 | mono_kit: 67c15c1486e232d7f44ac47286933e80aa02f7a3 47 | url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 48 | 49 | PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 50 | 51 | COCOAPODS: 1.13.0 52 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /flutter/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 4 | import 'package:mono_kit/mono_kit.dart'; 5 | 6 | import 'pages/pages.dart'; 7 | 8 | void main() => runApp( 9 | const ProviderScope( 10 | child: App(), 11 | ), 12 | ); 13 | 14 | class App extends StatelessWidget { 15 | const App({super.key}); 16 | 17 | static final _routes = { 18 | '/': const HomePage(), 19 | LandmarksPage.routeName: const LandmarksPage(), 20 | }; 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Theme( 25 | data: _theme(), 26 | child: CupertinoApp( 27 | title: 'Flutter', 28 | theme: const CupertinoThemeData( 29 | barBackgroundColor: Colors.white, 30 | ), 31 | onGenerateRoute: (settings) { 32 | final routeName = settings.name!; 33 | final title = routeName.replaceAll('/', ''); 34 | return CupertinoPageRoute( 35 | title: title.isEmpty ? 'Flutter' : title, 36 | settings: settings, 37 | builder: (context) => _routes[routeName]!, 38 | ); 39 | }, 40 | ), 41 | ); 42 | } 43 | 44 | ThemeData _theme() { 45 | final base = ThemeData.light(); 46 | return base 47 | .copyWith( 48 | textTheme: base.textTheme.copyWith( 49 | titleLarge: base.textTheme.titleLarge!.copyWith( 50 | fontSize: 28, 51 | ), 52 | titleMedium: base.textTheme.titleMedium!.copyWith( 53 | fontSize: 16, 54 | ), 55 | ), 56 | dividerColor: Colors.black26, 57 | ) 58 | .followLatestSpec(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | func applicationWillTerminate(_ application: UIApplication) { 22 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 23 | } 24 | 25 | // MARK: UISceneSession Lifecycle 26 | 27 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 28 | // Called when a new scene session is being created. 29 | // Use this method to select a configuration to create the new scene with. 30 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 31 | } 32 | 33 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 34 | // Called when the user discards a scene session. 35 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 36 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 37 | } 38 | 39 | 40 | } 41 | 42 | -------------------------------------------------------------------------------- /flutter/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled. 5 | 6 | version: 7 | revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 17 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 18 | - platform: android 19 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 20 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 21 | - platform: ios 22 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 23 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 24 | - platform: linux 25 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 26 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 27 | - platform: macos 28 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 29 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 30 | - platform: web 31 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 32 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 33 | - platform: windows 34 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 35 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /flutter/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 14 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 31 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Swiftui Flutter 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | swiftui_flutter 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/landmarks_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 4 | 5 | import 'landmark_row.dart'; 6 | import 'models/models.dart'; 7 | 8 | class LandmarksPage extends ConsumerWidget { 9 | const LandmarksPage({super.key}); 10 | 11 | static const routeName = '/Landmarks'; 12 | 13 | @override 14 | Widget build(BuildContext context, WidgetRef ref) { 15 | final landmarks = ref.watch(landmarkListProvider).value; 16 | return landmarks == null 17 | ? const Center( 18 | child: CircularProgressIndicator.adaptive(), 19 | ) 20 | : CupertinoPageScaffold( 21 | child: CustomScrollView( 22 | slivers: [ 23 | const CupertinoSliverNavigationBar(), 24 | // https://github.com/flutter/flutter/issues/119558 25 | SliverToBoxAdapter( 26 | child: CupertinoListSection( 27 | topMargin: 0, 28 | backgroundColor: Colors.transparent, 29 | children: [ 30 | CupertinoListTile( 31 | title: Row( 32 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 33 | children: [ 34 | const Text('Favorites only'), 35 | CupertinoSwitch( 36 | value: ref.watch(showFavoritesOnlyProvider), 37 | onChanged: (value) => ref 38 | .read(showFavoritesOnlyProvider.notifier) 39 | .toggle(), 40 | ), 41 | ], 42 | ), 43 | ), 44 | for (final landmark in landmarks) 45 | LandmarkRow(id: landmark.id), 46 | ], 47 | ), 48 | ), 49 | ], 50 | ), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /swiftui/.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | # Pods/ 50 | # 51 | # Add this line if you want to avoid checking in source code from the Xcode workspace 52 | # *.xcworkspace 53 | 54 | # Carthage 55 | # 56 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 57 | # Carthage/Checkouts 58 | 59 | Carthage/Build 60 | 61 | # Accio dependency management 62 | Dependencies/ 63 | .accio/ 64 | 65 | # fastlane 66 | # 67 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 68 | # screenshots whenever they are needed. 69 | # For more information about the recommended setup visit: 70 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 71 | 72 | fastlane/report.xml 73 | fastlane/Preview.html 74 | fastlane/screenshots/**/*.png 75 | fastlane/test_output 76 | 77 | # Code Injection 78 | # 79 | # After new code Injection tools there's a generated folder /iOSInjectionProject 80 | # https://github.com/johnno1962/injectionforxcode 81 | 82 | iOSInjectionProject/ 83 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UILaunchStoryboardName 33 | LaunchScreen 34 | UISceneConfigurationName 35 | Default Configuration 36 | UISceneDelegateClassName 37 | $(PRODUCT_MODULE_NAME).SceneDelegate 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UISupportedInterfaceOrientations~ipad 55 | 56 | UIInterfaceOrientationPortrait 57 | UIInterfaceOrientationPortraitUpsideDown 58 | UIInterfaceOrientationLandscapeLeft 59 | UIInterfaceOrientationLandscapeRight 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/LandmarkDetail.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LandmarkDetail.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct LandmarkDetail: View { 12 | @EnvironmentObject var userData: UserData 13 | var landmark: Landmark 14 | 15 | var landmarkIndex: Int { 16 | userData.landmarks.firstIndex(where: { $0.id == landmark.id })! 17 | } 18 | 19 | var body: some View { 20 | VStack { 21 | MapView(coordinate: landmark.locationCoordinate) 22 | .frame(height: 300) 23 | 24 | CircleImage(image: landmark.image(forSize: 250)) 25 | .offset(x: 0, y: -130) 26 | .padding(.bottom, -130) 27 | 28 | VStack(alignment: .leading) { 29 | HStack { 30 | Text(landmark.name) 31 | .font(.title) 32 | Button(action: { 33 | self.userData.landmarks[self.landmarkIndex].isFavorite.toggle() 34 | }) { 35 | if self.userData.landmarks[self.landmarkIndex].isFavorite { 36 | Image(systemName: "star.fill") 37 | .foregroundColor(Color.yellow) 38 | } else { 39 | Image(systemName: "star") 40 | .foregroundColor(Color.gray) 41 | } 42 | } 43 | } 44 | 45 | HStack(alignment: .top) { 46 | Text(landmark.park) 47 | .font(.subheadline) 48 | Spacer() 49 | Text(landmark.state) 50 | .font(.subheadline) 51 | } 52 | } 53 | .padding() 54 | 55 | Spacer() 56 | } 57 | .navigationBarTitle(Text(verbatim: landmark.name), displayMode: .inline) 58 | } 59 | } 60 | 61 | #if DEBUG 62 | struct LandmarkDetail_Previews: PreviewProvider { 63 | static var previews: some View { 64 | LandmarkDetail(landmark: landmarkData[0]) 65 | .environmentObject(UserData()) 66 | } 67 | } 68 | #endif 69 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /flutter/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | namespace "com.mono0926.swiftui_flutter" 30 | compileSdkVersion flutter.compileSdkVersion 31 | ndkVersion flutter.ndkVersion 32 | 33 | compileOptions { 34 | sourceCompatibility JavaVersion.VERSION_1_8 35 | targetCompatibility JavaVersion.VERSION_1_8 36 | } 37 | 38 | kotlinOptions { 39 | jvmTarget = '1.8' 40 | } 41 | 42 | sourceSets { 43 | main.java.srcDirs += 'src/main/kotlin' 44 | } 45 | 46 | defaultConfig { 47 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 48 | applicationId "com.mono0926.swiftui_flutter" 49 | // You can update the following values to match your application needs. 50 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 51 | minSdkVersion 21 52 | targetSdkVersion flutter.targetSdkVersion 53 | versionCode flutterVersionCode.toInteger() 54 | versionName flutterVersionName 55 | } 56 | 57 | buildTypes { 58 | release { 59 | // TODO: Add your own signing config for the release build. 60 | // Signing with the debug keys for now, so `flutter run --release` works. 61 | signingConfig signingConfigs.debug 62 | } 63 | } 64 | } 65 | 66 | flutter { 67 | source '../..' 68 | } 69 | 70 | dependencies { 71 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 72 | } 73 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftUI 11 | 12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 21 | 22 | // Use a UIHostingController as window root view controller 23 | let window = UIWindow(frame: UIScreen.main.bounds) 24 | window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(UserData())) 25 | self.window = window 26 | window.makeKeyAndVisible() 27 | } 28 | 29 | func sceneDidDisconnect(_ scene: UIScene) { 30 | // Called as the scene is being released by the system. 31 | // This occurs shortly after the scene enters the background, or when its session is discarded. 32 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 33 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 34 | } 35 | 36 | func sceneDidBecomeActive(_ scene: UIScene) { 37 | // Called when the scene has moved from an inactive state to an active state. 38 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 39 | } 40 | 41 | func sceneWillResignActive(_ scene: UIScene) { 42 | // Called when the scene will move from an active state to an inactive state. 43 | // This may occur due to temporary interruptions (ex. an incoming phone call). 44 | } 45 | 46 | func sceneWillEnterForeground(_ scene: UIScene) { 47 | // Called as the scene transitions from the background to the foreground. 48 | // Use this method to undo the changes made on entering the background. 49 | } 50 | 51 | func sceneDidEnterBackground(_ scene: UIScene) { 52 | // Called as the scene transitions from the foreground to the background. 53 | // Use this method to save data, release shared resources, and store enough scene-specific state information 54 | // to restore the scene back to its current state. 55 | } 56 | 57 | 58 | } 59 | 60 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/detail/content.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 4 | import 'package:swiftui_flutter/pages/landmarks/detail/landmark_detail.dart'; 5 | 6 | import '../models/models.dart'; 7 | import 'circle_image.dart'; 8 | import 'map_view.dart'; 9 | 10 | class Content extends ConsumerWidget { 11 | const Content({super.key}); 12 | 13 | @override 14 | Widget build(BuildContext context, WidgetRef ref) { 15 | final textTheme = Theme.of(context).textTheme; 16 | final id = ref.watch(selectedLandmarkId)!; 17 | final landmark = ref.watch(landmarkProviderFamily(id)).value!; 18 | final isFavorite = ref.watch(isFavoriteProviderFamily(id)); 19 | return Column( 20 | children: [ 21 | Stack( 22 | alignment: Alignment.bottomCenter, 23 | clipBehavior: Clip.none, 24 | children: [ 25 | SizedBox( 26 | height: 300, 27 | child: MapView(latLng: landmark.latLng), 28 | ), 29 | Positioned( 30 | bottom: -130, 31 | child: CircleImage(imageName: landmark.imageName), 32 | ), 33 | ], 34 | ), 35 | const SizedBox(height: 130), 36 | Padding( 37 | padding: const EdgeInsets.all(16), 38 | child: Column( 39 | crossAxisAlignment: CrossAxisAlignment.start, 40 | children: [ 41 | Row( 42 | children: [ 43 | Text( 44 | landmark.name, 45 | style: textTheme.titleLarge, 46 | ), 47 | CupertinoButton( 48 | onPressed: () { 49 | ref.read(favoriteProvider.notifier).update( 50 | id: id, 51 | isFavorite: !isFavorite, 52 | ); 53 | }, 54 | child: Icon( 55 | isFavorite ? Icons.star : Icons.star_border, 56 | color: isFavorite ? Colors.yellow[700] : Colors.grey, 57 | ), 58 | ), 59 | ], 60 | ), 61 | Row( 62 | children: [ 63 | Expanded( 64 | child: Text( 65 | landmark.park, 66 | style: textTheme.titleMedium, 67 | maxLines: 1, 68 | overflow: TextOverflow.ellipsis, 69 | ), 70 | ), 71 | const SizedBox(width: 4), 72 | Text( 73 | landmark.state, 74 | style: textTheme.titleMedium, 75 | ), 76 | ], 77 | ), 78 | ], 79 | ), 80 | ), 81 | ], 82 | ); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Models/Data.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Data.swift 3 | // swiftuiFlutter 4 | // 5 | // Created by mono on 2019/06/06. 6 | // Copyright © 2019 Aquatica Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftUI 11 | import CoreLocation 12 | 13 | let landmarkData: [Landmark] = load("landmarkData.json") 14 | 15 | func load(_ filename: String, as type: T.Type = T.self) -> T { 16 | let data: Data 17 | 18 | guard let file = Bundle.main.url(forResource: filename, withExtension: nil) 19 | else { 20 | fatalError("Couldn't find \(filename) in main bundle.") 21 | } 22 | 23 | do { 24 | data = try Data(contentsOf: file) 25 | } catch { 26 | fatalError("Couldn't load \(filename) from main bundle:\n\(error)") 27 | } 28 | 29 | do { 30 | let decoder = JSONDecoder() 31 | return try decoder.decode(T.self, from: data) 32 | } catch { 33 | fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") 34 | } 35 | } 36 | 37 | final class ImageStore { 38 | fileprivate typealias _ImageDictionary = [String: [Int: CGImage]] 39 | fileprivate var images: _ImageDictionary = [:] 40 | 41 | fileprivate static var originalSize = 250 42 | fileprivate static var scale = 2 43 | 44 | static var shared = ImageStore() 45 | 46 | func image(name: String, size: Int) -> Image { 47 | let index = _guaranteeInitialImage(name: name) 48 | 49 | let sizedImage = images.values[index][size] 50 | ?? _sizeImage(images.values[index][ImageStore.originalSize]!, to: size * ImageStore.scale) 51 | images.values[index][size] = sizedImage 52 | 53 | return Image(sizedImage, scale: Length(ImageStore.scale), label: Text(verbatim: name)) 54 | } 55 | 56 | fileprivate func _guaranteeInitialImage(name: String) -> _ImageDictionary.Index { 57 | if let index = images.index(forKey: name) { return index } 58 | 59 | guard 60 | let url = Bundle.main.url(forResource: name, withExtension: "jpg"), 61 | let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), 62 | let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) 63 | else { 64 | fatalError("Couldn't load image \(name).jpg from main bundle.") 65 | } 66 | 67 | images[name] = [ImageStore.originalSize: image] 68 | return images.index(forKey: name)! 69 | } 70 | 71 | fileprivate func _sizeImage(_ image: CGImage, to size: Int) -> CGImage { 72 | guard 73 | let colorSpace = image.colorSpace, 74 | let context = CGContext( 75 | data: nil, 76 | width: size, height: size, 77 | bitsPerComponent: image.bitsPerComponent, 78 | bytesPerRow: image.bytesPerRow, 79 | space: colorSpace, 80 | bitmapInfo: image.bitmapInfo.rawValue) 81 | else { 82 | fatalError("Couldn't create graphics context.") 83 | } 84 | context.interpolationQuality = .high 85 | context.draw(image, in: CGRect(x: 0, y: 0, width: size, height: size)) 86 | 87 | if let sizedImage = context.makeImage() { 88 | return sizedImage 89 | } else { 90 | fatalError("Couldn't resize image.") 91 | } 92 | } 93 | } 94 | 95 | 96 | -------------------------------------------------------------------------------- /flutter/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /flutter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 49 | 50 | 51 | 52 | 53 | 63 | 65 | 71 | 72 | 73 | 74 | 80 | 82 | 88 | 89 | 90 | 91 | 93 | 94 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /flutter/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | swiftui_flutter 33 | 34 | 35 | 36 | 39 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /flutter/assets/landmarkData.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Turtle Rock", 4 | "category": "Rivers", 5 | "city": "Twentynine Palms", 6 | "state": "California", 7 | "id": 1001, 8 | "isFeatured": true, 9 | "park": "Joshua Tree National Park", 10 | "coordinates": { 11 | "longitude": -116.166868, 12 | "latitude": 34.011286 13 | }, 14 | "imageName": "turtlerock" 15 | }, 16 | { 17 | "name": "Silver Salmon Creek", 18 | "category": "Lakes", 19 | "city": "Port Alsworth", 20 | "state": "Alaska", 21 | "id": 1002, 22 | "isFeatured": false, 23 | "park": "Lake Clark National Park and Preserve", 24 | "coordinates": { 25 | "longitude": -152.665167, 26 | "latitude": 59.980167 27 | }, 28 | "imageName": "silversalmoncreek" 29 | }, 30 | { 31 | "name": "Chilkoot Trail", 32 | "category": "Mountains", 33 | "city": "Skagway", 34 | "state": "Alaska", 35 | "id": 1003, 36 | "isFeatured": false, 37 | "park": "Klondike Gold Rush National Historical Park", 38 | "coordinates": { 39 | "longitude": -135.334571, 40 | "latitude": 59.560551 41 | }, 42 | "imageName": "chilkoottrail" 43 | }, 44 | { 45 | "name": "St. Mary Lake", 46 | "category": "Lakes", 47 | "city": "Browning", 48 | "state": "Montana", 49 | "id": 1004, 50 | "isFeatured": true, 51 | "park": "Glacier National Park", 52 | "coordinates": { 53 | "longitude": -113.536248, 54 | "latitude": 48.69423 55 | }, 56 | "imageName": "stmarylake" 57 | }, 58 | { 59 | "name": "Twin Lake", 60 | "category": "Lakes", 61 | "city": "Twin Lakes", 62 | "state": "Alaska", 63 | "id": 1005, 64 | "isFeatured": false, 65 | "park": "Lake Clark National Park and Preserve", 66 | "coordinates": { 67 | "longitude": -153.849883, 68 | "latitude": 60.641684 69 | }, 70 | "imageName": "twinlake" 71 | }, 72 | { 73 | "name": "Lake McDonald", 74 | "category": "Mountains", 75 | "city": "West Glacier", 76 | "state": "Montana", 77 | "id": 1006, 78 | "isFeatured": false, 79 | "park": "Glacier National Park", 80 | "coordinates": { 81 | "longitude": -113.934831, 82 | "latitude": 48.56002 83 | }, 84 | "imageName": "lakemcdonald" 85 | }, 86 | { 87 | "name": "Charley Rivers", 88 | "category": "Rivers", 89 | "city": "Eaking", 90 | "state": "Alaska", 91 | "id": 1007, 92 | "isFeatured": true, 93 | "park": "Charley Rivers National Preserve", 94 | "coordinates": { 95 | "longitude": -143.122586, 96 | "latitude": 65.350021 97 | }, 98 | "imageName": "charleyrivers" 99 | }, 100 | { 101 | "name": "Icy Bay", 102 | "category": "Mountains", 103 | "city": "Icy Bay", 104 | "state": "Alaska", 105 | "id": 1008, 106 | "isFeatured": false, 107 | "park": "Wrangell-St. Elias National Park and Preserve", 108 | "coordinates": { 109 | "longitude": -141.518167, 110 | "latitude": 60.089917 111 | }, 112 | "imageName": "icybay" 113 | }, 114 | { 115 | "name": "Rainbow Lake", 116 | "category": "Lakes", 117 | "city": "Willow", 118 | "state": "Alaska", 119 | "id": 1009, 120 | "isFeatured": false, 121 | "park": "State Recreation Area", 122 | "coordinates": { 123 | "longitude": -150.086103, 124 | "latitude": 61.694334 125 | }, 126 | "imageName": "rainbowlake" 127 | }, 128 | { 129 | "name": "Hidden Lake", 130 | "category": "Lakes", 131 | "city": "Newhalem", 132 | "state": "Washington", 133 | "id": 1010, 134 | "isFeatured": false, 135 | "park": "North Cascades National Park", 136 | "coordinates": { 137 | "longitude": -121.17799, 138 | "latitude": 48.495442 139 | }, 140 | "imageName": "hiddenlake" 141 | }, 142 | { 143 | "name": "Chincoteague", 144 | "category": "Rivers", 145 | "city": "Chincoteague", 146 | "state": "Virginia", 147 | "id": 1011, 148 | "isFeatured": false, 149 | "park": "Chincoteague National Wildlife Refuge", 150 | "coordinates": { 151 | "longitude": -75.383212, 152 | "latitude": 37.91531 153 | }, 154 | "imageName": "chincoteague" 155 | }, 156 | { 157 | "name": "Lake Umbagog", 158 | "category": "Lakes", 159 | "city": "Errol", 160 | "state": "New Hampshire", 161 | "id": 1012, 162 | "isFeatured": true, 163 | "park": "Umbagog National Wildlife Refuge", 164 | "coordinates": { 165 | "longitude": -71.056816, 166 | "latitude": 44.747408 167 | }, 168 | "imageName": "umbagog" 169 | } 170 | ] 171 | -------------------------------------------------------------------------------- /swiftui/swiftuiFlutter/Landmarks/Resources/landmarkData.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Turtle Rock", 4 | "category": "Rivers", 5 | "city": "Twentynine Palms", 6 | "state": "California", 7 | "id": 1001, 8 | "isFeatured": true, 9 | "isFavorite": true, 10 | "park": "Joshua Tree National Park", 11 | "coordinates": { 12 | "longitude": -116.166868, 13 | "latitude": 34.011286 14 | }, 15 | "imageName": "turtlerock" 16 | }, 17 | { 18 | "name": "Silver Salmon Creek", 19 | "category": "Lakes", 20 | "city": "Port Alsworth", 21 | "state": "Alaska", 22 | "id": 1002, 23 | "isFeatured": false, 24 | "isFavorite": false, 25 | "park": "Lake Clark National Park and Preserve", 26 | "coordinates": { 27 | "longitude": -152.665167, 28 | "latitude": 59.980167 29 | }, 30 | "imageName": "silversalmoncreek" 31 | }, 32 | { 33 | "name": "Chilkoot Trail", 34 | "category": "Mountains", 35 | "city": "Skagway", 36 | "state": "Alaska", 37 | "id": 1003, 38 | "isFeatured": false, 39 | "isFavorite": true, 40 | "park": "Klondike Gold Rush National Historical Park", 41 | "coordinates": { 42 | "longitude": -135.334571, 43 | "latitude": 59.560551 44 | }, 45 | "imageName": "chilkoottrail" 46 | }, 47 | { 48 | "name": "St. Mary Lake", 49 | "category": "Lakes", 50 | "city": "Browning", 51 | "state": "Montana", 52 | "id": 1004, 53 | "isFeatured": true, 54 | "isFavorite": true, 55 | "park": "Glacier National Park", 56 | "coordinates": { 57 | "longitude": -113.536248, 58 | "latitude": 48.69423 59 | }, 60 | "imageName": "stmarylake" 61 | }, 62 | { 63 | "name": "Twin Lake", 64 | "category": "Lakes", 65 | "city": "Twin Lakes", 66 | "state": "Alaska", 67 | "id": 1005, 68 | "isFeatured": false, 69 | "isFavorite": false, 70 | "park": "Lake Clark National Park and Preserve", 71 | "coordinates": { 72 | "longitude": -153.849883, 73 | "latitude": 60.641684 74 | }, 75 | "imageName": "twinlake" 76 | }, 77 | { 78 | "name": "Lake McDonald", 79 | "category": "Mountains", 80 | "city": "West Glacier", 81 | "state": "Montana", 82 | "id": 1006, 83 | "isFeatured": false, 84 | "isFavorite": false, 85 | "park": "Glacier National Park", 86 | "coordinates": { 87 | "longitude": -113.934831, 88 | "latitude": 48.56002 89 | }, 90 | "imageName": "lakemcdonald" 91 | }, 92 | { 93 | "name": "Charley Rivers", 94 | "category": "Rivers", 95 | "city": "Eaking", 96 | "state": "Alaska", 97 | "id": 1007, 98 | "isFeatured": true, 99 | "isFavorite": false, 100 | "park": "Charley Rivers National Preserve", 101 | "coordinates": { 102 | "longitude": -143.122586, 103 | "latitude": 65.350021 104 | }, 105 | "imageName": "charleyrivers", 106 | }, 107 | { 108 | "name": "Icy Bay", 109 | "category": "Mountains", 110 | "city": "Icy Bay", 111 | "state": "Alaska", 112 | "id": 1008, 113 | "isFeatured": false, 114 | "isFavorite": false, 115 | "park": "Wrangell-St. Elias National Park and Preserve", 116 | "coordinates": { 117 | "longitude": -141.518167, 118 | "latitude": 60.089917 119 | }, 120 | "imageName": "icybay" 121 | }, 122 | { 123 | "name": "Rainbow Lake", 124 | "category": "Lakes", 125 | "city": "Willow", 126 | "state": "Alaska", 127 | "id": 1009, 128 | "isFeatured": false, 129 | "isFavorite": false, 130 | "park": "State Recreation Area", 131 | "coordinates": { 132 | "longitude": -150.086103, 133 | "latitude": 61.694334 134 | }, 135 | "imageName": "rainbowlake" 136 | }, 137 | { 138 | "name": "Hidden Lake", 139 | "category": "Lakes", 140 | "city": "Newhalem", 141 | "state": "Washington", 142 | "id": 1010, 143 | "isFeatured": false, 144 | "isFavorite": false, 145 | "park": "North Cascades National Park", 146 | "coordinates": { 147 | "longitude": -121.17799, 148 | "latitude": 48.495442 149 | }, 150 | "imageName": "hiddenlake" 151 | }, 152 | { 153 | "name": "Chincoteague", 154 | "category": "Rivers", 155 | "city": "Chincoteague", 156 | "state": "Virginia", 157 | "id": 1011, 158 | "isFeatured": false, 159 | "isFavorite": false, 160 | "park": "Chincoteague National Wildlife Refuge", 161 | "coordinates": { 162 | "longitude": -75.383212, 163 | "latitude": 37.91531 164 | }, 165 | "imageName": "chincoteague" 166 | }, 167 | { 168 | "name": "Lake Umbagog", 169 | "category": "Lakes", 170 | "city": "Errol", 171 | "state": "New Hampshire", 172 | "id": 1012, 173 | "isFeatured": true, 174 | "isFavorite": false, 175 | "park": "Umbagog National Wildlife Refuge", 176 | "coordinates": { 177 | "longitude": -71.056816, 178 | "latitude": 44.747408 179 | }, 180 | "imageName": "umbagog" 181 | } 182 | ] 183 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/user_data.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | // ignore_for_file: type=lint, implicit_dynamic_parameter, implicit_dynamic_type, implicit_dynamic_method, strict_raw_type 4 | 5 | part of 'user_data.dart'; 6 | 7 | // ************************************************************************** 8 | // RiverpodGenerator 9 | // ************************************************************************** 10 | 11 | String _$isFavoriteHash() => r'c7bead389f0c058fe2a7607972d8f2edf96440ba'; 12 | 13 | /// Copied from Dart SDK 14 | class _SystemHash { 15 | _SystemHash._(); 16 | 17 | static int combine(int hash, int value) { 18 | // ignore: parameter_assignments 19 | hash = 0x1fffffff & (hash + value); 20 | // ignore: parameter_assignments 21 | hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); 22 | return hash ^ (hash >> 6); 23 | } 24 | 25 | static int finish(int hash) { 26 | // ignore: parameter_assignments 27 | hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); 28 | // ignore: parameter_assignments 29 | hash = hash ^ (hash >> 11); 30 | return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); 31 | } 32 | } 33 | 34 | /// See also [isFavorite]. 35 | @ProviderFor(isFavorite) 36 | const isFavoriteProviderFamily = IsFavoriteFamily(); 37 | 38 | /// See also [isFavorite]. 39 | class IsFavoriteFamily extends Family { 40 | /// See also [isFavorite]. 41 | const IsFavoriteFamily(); 42 | 43 | /// See also [isFavorite]. 44 | IsFavoriteProvider call( 45 | int id, 46 | ) { 47 | return IsFavoriteProvider( 48 | id, 49 | ); 50 | } 51 | 52 | @override 53 | IsFavoriteProvider getProviderOverride( 54 | covariant IsFavoriteProvider provider, 55 | ) { 56 | return call( 57 | provider.id, 58 | ); 59 | } 60 | 61 | static const Iterable? _dependencies = null; 62 | 63 | @override 64 | Iterable? get dependencies => _dependencies; 65 | 66 | static const Iterable? _allTransitiveDependencies = null; 67 | 68 | @override 69 | Iterable? get allTransitiveDependencies => 70 | _allTransitiveDependencies; 71 | 72 | @override 73 | String? get name => r'isFavoriteProviderFamily'; 74 | } 75 | 76 | /// See also [isFavorite]. 77 | class IsFavoriteProvider extends AutoDisposeProvider { 78 | /// See also [isFavorite]. 79 | IsFavoriteProvider( 80 | int id, 81 | ) : this._internal( 82 | (ref) => isFavorite( 83 | ref as IsFavoriteRef, 84 | id, 85 | ), 86 | from: isFavoriteProviderFamily, 87 | name: r'isFavoriteProviderFamily', 88 | debugGetCreateSourceHash: 89 | const bool.fromEnvironment('dart.vm.product') 90 | ? null 91 | : _$isFavoriteHash, 92 | dependencies: IsFavoriteFamily._dependencies, 93 | allTransitiveDependencies: 94 | IsFavoriteFamily._allTransitiveDependencies, 95 | id: id, 96 | ); 97 | 98 | IsFavoriteProvider._internal( 99 | super._createNotifier, { 100 | required super.name, 101 | required super.dependencies, 102 | required super.allTransitiveDependencies, 103 | required super.debugGetCreateSourceHash, 104 | required super.from, 105 | required this.id, 106 | }) : super.internal(); 107 | 108 | final int id; 109 | 110 | @override 111 | Override overrideWith( 112 | bool Function(IsFavoriteRef provider) create, 113 | ) { 114 | return ProviderOverride( 115 | origin: this, 116 | override: IsFavoriteProvider._internal( 117 | (ref) => create(ref as IsFavoriteRef), 118 | from: from, 119 | name: null, 120 | dependencies: null, 121 | allTransitiveDependencies: null, 122 | debugGetCreateSourceHash: null, 123 | id: id, 124 | ), 125 | ); 126 | } 127 | 128 | @override 129 | AutoDisposeProviderElement createElement() { 130 | return _IsFavoriteProviderElement(this); 131 | } 132 | 133 | @override 134 | bool operator ==(Object other) { 135 | return other is IsFavoriteProvider && other.id == id; 136 | } 137 | 138 | @override 139 | int get hashCode { 140 | var hash = _SystemHash.combine(0, runtimeType.hashCode); 141 | hash = _SystemHash.combine(hash, id.hashCode); 142 | 143 | return _SystemHash.finish(hash); 144 | } 145 | } 146 | 147 | mixin IsFavoriteRef on AutoDisposeProviderRef { 148 | /// The parameter `id` of this provider. 149 | int get id; 150 | } 151 | 152 | class _IsFavoriteProviderElement extends AutoDisposeProviderElement 153 | with IsFavoriteRef { 154 | _IsFavoriteProviderElement(super.provider); 155 | 156 | @override 157 | int get id => (origin as IsFavoriteProvider).id; 158 | } 159 | 160 | String _$landmarkHash() => r'efef45e1281593139b66ec39968297f2000f15f9'; 161 | 162 | /// See also [landmark]. 163 | @ProviderFor(landmark) 164 | const landmarkProviderFamily = LandmarkFamily(); 165 | 166 | /// See also [landmark]. 167 | class LandmarkFamily extends Family> { 168 | /// See also [landmark]. 169 | const LandmarkFamily(); 170 | 171 | /// See also [landmark]. 172 | LandmarkProvider call( 173 | int id, 174 | ) { 175 | return LandmarkProvider( 176 | id, 177 | ); 178 | } 179 | 180 | @override 181 | LandmarkProvider getProviderOverride( 182 | covariant LandmarkProvider provider, 183 | ) { 184 | return call( 185 | provider.id, 186 | ); 187 | } 188 | 189 | static const Iterable? _dependencies = null; 190 | 191 | @override 192 | Iterable? get dependencies => _dependencies; 193 | 194 | static const Iterable? _allTransitiveDependencies = null; 195 | 196 | @override 197 | Iterable? get allTransitiveDependencies => 198 | _allTransitiveDependencies; 199 | 200 | @override 201 | String? get name => r'landmarkProviderFamily'; 202 | } 203 | 204 | /// See also [landmark]. 205 | class LandmarkProvider extends AutoDisposeFutureProvider { 206 | /// See also [landmark]. 207 | LandmarkProvider( 208 | int id, 209 | ) : this._internal( 210 | (ref) => landmark( 211 | ref as LandmarkRef, 212 | id, 213 | ), 214 | from: landmarkProviderFamily, 215 | name: r'landmarkProviderFamily', 216 | debugGetCreateSourceHash: 217 | const bool.fromEnvironment('dart.vm.product') 218 | ? null 219 | : _$landmarkHash, 220 | dependencies: LandmarkFamily._dependencies, 221 | allTransitiveDependencies: LandmarkFamily._allTransitiveDependencies, 222 | id: id, 223 | ); 224 | 225 | LandmarkProvider._internal( 226 | super._createNotifier, { 227 | required super.name, 228 | required super.dependencies, 229 | required super.allTransitiveDependencies, 230 | required super.debugGetCreateSourceHash, 231 | required super.from, 232 | required this.id, 233 | }) : super.internal(); 234 | 235 | final int id; 236 | 237 | @override 238 | Override overrideWith( 239 | FutureOr Function(LandmarkRef provider) create, 240 | ) { 241 | return ProviderOverride( 242 | origin: this, 243 | override: LandmarkProvider._internal( 244 | (ref) => create(ref as LandmarkRef), 245 | from: from, 246 | name: null, 247 | dependencies: null, 248 | allTransitiveDependencies: null, 249 | debugGetCreateSourceHash: null, 250 | id: id, 251 | ), 252 | ); 253 | } 254 | 255 | @override 256 | AutoDisposeFutureProviderElement createElement() { 257 | return _LandmarkProviderElement(this); 258 | } 259 | 260 | @override 261 | bool operator ==(Object other) { 262 | return other is LandmarkProvider && other.id == id; 263 | } 264 | 265 | @override 266 | int get hashCode { 267 | var hash = _SystemHash.combine(0, runtimeType.hashCode); 268 | hash = _SystemHash.combine(hash, id.hashCode); 269 | 270 | return _SystemHash.finish(hash); 271 | } 272 | } 273 | 274 | mixin LandmarkRef on AutoDisposeFutureProviderRef { 275 | /// The parameter `id` of this provider. 276 | int get id; 277 | } 278 | 279 | class _LandmarkProviderElement 280 | extends AutoDisposeFutureProviderElement with LandmarkRef { 281 | _LandmarkProviderElement(super.provider); 282 | 283 | @override 284 | int get id => (origin as LandmarkProvider).id; 285 | } 286 | 287 | String _$landmarkListHash() => r'2a564952a4fc1c489c52ae486ab8dbb3f7fae3db'; 288 | 289 | /// See also [landmarkList]. 290 | @ProviderFor(landmarkList) 291 | final landmarkListProvider = AutoDisposeFutureProvider>.internal( 292 | landmarkList, 293 | name: r'landmarkListProvider', 294 | debugGetCreateSourceHash: 295 | const bool.fromEnvironment('dart.vm.product') ? null : _$landmarkListHash, 296 | dependencies: null, 297 | allTransitiveDependencies: null, 298 | ); 299 | 300 | typedef LandmarkListRef = AutoDisposeFutureProviderRef>; 301 | String _$showFavoritesOnlyHash() => r'be10495681e3048f4279e9ce218aec9cfce0a2b1'; 302 | 303 | /// See also [ShowFavoritesOnly]. 304 | @ProviderFor(ShowFavoritesOnly) 305 | final showFavoritesOnlyProvider = 306 | AutoDisposeNotifierProvider.internal( 307 | ShowFavoritesOnly.new, 308 | name: r'showFavoritesOnlyProvider', 309 | debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') 310 | ? null 311 | : _$showFavoritesOnlyHash, 312 | dependencies: null, 313 | allTransitiveDependencies: null, 314 | ); 315 | 316 | typedef _$ShowFavoritesOnly = AutoDisposeNotifier; 317 | String _$favoriteHash() => r'155e69679550a18d41a533a7f7f81e4c42acc4e1'; 318 | 319 | /// See also [Favorite]. 320 | @ProviderFor(Favorite) 321 | final favoriteProvider = 322 | AutoDisposeNotifierProvider>.internal( 323 | Favorite.new, 324 | name: r'favoriteProvider', 325 | debugGetCreateSourceHash: 326 | const bool.fromEnvironment('dart.vm.product') ? null : _$favoriteHash, 327 | dependencies: null, 328 | allTransitiveDependencies: null, 329 | ); 330 | 331 | typedef _$Favorite = AutoDisposeNotifier>; 332 | // ignore_for_file: type=lint 333 | // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member 334 | -------------------------------------------------------------------------------- /flutter/lib/pages/landmarks/models/landmark.freezed.dart: -------------------------------------------------------------------------------- 1 | // coverage:ignore-file 2 | // GENERATED CODE - DO NOT MODIFY BY HAND 3 | // ignore_for_file: type=lint 4 | // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark 5 | 6 | part of 'landmark.dart'; 7 | 8 | // ************************************************************************** 9 | // FreezedGenerator 10 | // ************************************************************************** 11 | 12 | T _$identity(T value) => value; 13 | 14 | final _privateConstructorUsedError = UnsupportedError( 15 | 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods'); 16 | 17 | Landmark _$LandmarkFromJson(Map json) { 18 | return _Landmark.fromJson(json); 19 | } 20 | 21 | /// @nodoc 22 | mixin _$Landmark { 23 | int get id => throw _privateConstructorUsedError; 24 | String get name => throw _privateConstructorUsedError; 25 | String get imageName => throw _privateConstructorUsedError; 26 | String get state => throw _privateConstructorUsedError; 27 | String get park => throw _privateConstructorUsedError; 28 | Coordinates get coordinates => throw _privateConstructorUsedError; 29 | 30 | Map toJson() => throw _privateConstructorUsedError; 31 | @JsonKey(ignore: true) 32 | $LandmarkCopyWith get copyWith => 33 | throw _privateConstructorUsedError; 34 | } 35 | 36 | /// @nodoc 37 | abstract class $LandmarkCopyWith<$Res> { 38 | factory $LandmarkCopyWith(Landmark value, $Res Function(Landmark) then) = 39 | _$LandmarkCopyWithImpl<$Res, Landmark>; 40 | @useResult 41 | $Res call( 42 | {int id, 43 | String name, 44 | String imageName, 45 | String state, 46 | String park, 47 | Coordinates coordinates}); 48 | 49 | $CoordinatesCopyWith<$Res> get coordinates; 50 | } 51 | 52 | /// @nodoc 53 | class _$LandmarkCopyWithImpl<$Res, $Val extends Landmark> 54 | implements $LandmarkCopyWith<$Res> { 55 | _$LandmarkCopyWithImpl(this._value, this._then); 56 | 57 | // ignore: unused_field 58 | final $Val _value; 59 | // ignore: unused_field 60 | final $Res Function($Val) _then; 61 | 62 | @pragma('vm:prefer-inline') 63 | @override 64 | $Res call({ 65 | Object? id = null, 66 | Object? name = null, 67 | Object? imageName = null, 68 | Object? state = null, 69 | Object? park = null, 70 | Object? coordinates = null, 71 | }) { 72 | return _then(_value.copyWith( 73 | id: null == id 74 | ? _value.id 75 | : id // ignore: cast_nullable_to_non_nullable 76 | as int, 77 | name: null == name 78 | ? _value.name 79 | : name // ignore: cast_nullable_to_non_nullable 80 | as String, 81 | imageName: null == imageName 82 | ? _value.imageName 83 | : imageName // ignore: cast_nullable_to_non_nullable 84 | as String, 85 | state: null == state 86 | ? _value.state 87 | : state // ignore: cast_nullable_to_non_nullable 88 | as String, 89 | park: null == park 90 | ? _value.park 91 | : park // ignore: cast_nullable_to_non_nullable 92 | as String, 93 | coordinates: null == coordinates 94 | ? _value.coordinates 95 | : coordinates // ignore: cast_nullable_to_non_nullable 96 | as Coordinates, 97 | ) as $Val); 98 | } 99 | 100 | @override 101 | @pragma('vm:prefer-inline') 102 | $CoordinatesCopyWith<$Res> get coordinates { 103 | return $CoordinatesCopyWith<$Res>(_value.coordinates, (value) { 104 | return _then(_value.copyWith(coordinates: value) as $Val); 105 | }); 106 | } 107 | } 108 | 109 | /// @nodoc 110 | abstract class _$$_LandmarkCopyWith<$Res> implements $LandmarkCopyWith<$Res> { 111 | factory _$$_LandmarkCopyWith( 112 | _$_Landmark value, $Res Function(_$_Landmark) then) = 113 | __$$_LandmarkCopyWithImpl<$Res>; 114 | @override 115 | @useResult 116 | $Res call( 117 | {int id, 118 | String name, 119 | String imageName, 120 | String state, 121 | String park, 122 | Coordinates coordinates}); 123 | 124 | @override 125 | $CoordinatesCopyWith<$Res> get coordinates; 126 | } 127 | 128 | /// @nodoc 129 | class __$$_LandmarkCopyWithImpl<$Res> 130 | extends _$LandmarkCopyWithImpl<$Res, _$_Landmark> 131 | implements _$$_LandmarkCopyWith<$Res> { 132 | __$$_LandmarkCopyWithImpl( 133 | _$_Landmark _value, $Res Function(_$_Landmark) _then) 134 | : super(_value, _then); 135 | 136 | @pragma('vm:prefer-inline') 137 | @override 138 | $Res call({ 139 | Object? id = null, 140 | Object? name = null, 141 | Object? imageName = null, 142 | Object? state = null, 143 | Object? park = null, 144 | Object? coordinates = null, 145 | }) { 146 | return _then(_$_Landmark( 147 | id: null == id 148 | ? _value.id 149 | : id // ignore: cast_nullable_to_non_nullable 150 | as int, 151 | name: null == name 152 | ? _value.name 153 | : name // ignore: cast_nullable_to_non_nullable 154 | as String, 155 | imageName: null == imageName 156 | ? _value.imageName 157 | : imageName // ignore: cast_nullable_to_non_nullable 158 | as String, 159 | state: null == state 160 | ? _value.state 161 | : state // ignore: cast_nullable_to_non_nullable 162 | as String, 163 | park: null == park 164 | ? _value.park 165 | : park // ignore: cast_nullable_to_non_nullable 166 | as String, 167 | coordinates: null == coordinates 168 | ? _value.coordinates 169 | : coordinates // ignore: cast_nullable_to_non_nullable 170 | as Coordinates, 171 | )); 172 | } 173 | } 174 | 175 | /// @nodoc 176 | @JsonSerializable() 177 | class _$_Landmark extends _Landmark { 178 | _$_Landmark( 179 | {required this.id, 180 | required this.name, 181 | required this.imageName, 182 | required this.state, 183 | required this.park, 184 | required this.coordinates}) 185 | : super._(); 186 | 187 | factory _$_Landmark.fromJson(Map json) => 188 | _$$_LandmarkFromJson(json); 189 | 190 | @override 191 | final int id; 192 | @override 193 | final String name; 194 | @override 195 | final String imageName; 196 | @override 197 | final String state; 198 | @override 199 | final String park; 200 | @override 201 | final Coordinates coordinates; 202 | 203 | @override 204 | String toString() { 205 | return 'Landmark(id: $id, name: $name, imageName: $imageName, state: $state, park: $park, coordinates: $coordinates)'; 206 | } 207 | 208 | @override 209 | bool operator ==(dynamic other) { 210 | return identical(this, other) || 211 | (other.runtimeType == runtimeType && 212 | other is _$_Landmark && 213 | (identical(other.id, id) || other.id == id) && 214 | (identical(other.name, name) || other.name == name) && 215 | (identical(other.imageName, imageName) || 216 | other.imageName == imageName) && 217 | (identical(other.state, state) || other.state == state) && 218 | (identical(other.park, park) || other.park == park) && 219 | (identical(other.coordinates, coordinates) || 220 | other.coordinates == coordinates)); 221 | } 222 | 223 | @JsonKey(ignore: true) 224 | @override 225 | int get hashCode => 226 | Object.hash(runtimeType, id, name, imageName, state, park, coordinates); 227 | 228 | @JsonKey(ignore: true) 229 | @override 230 | @pragma('vm:prefer-inline') 231 | _$$_LandmarkCopyWith<_$_Landmark> get copyWith => 232 | __$$_LandmarkCopyWithImpl<_$_Landmark>(this, _$identity); 233 | 234 | @override 235 | Map toJson() { 236 | return _$$_LandmarkToJson( 237 | this, 238 | ); 239 | } 240 | } 241 | 242 | abstract class _Landmark extends Landmark { 243 | factory _Landmark( 244 | {required final int id, 245 | required final String name, 246 | required final String imageName, 247 | required final String state, 248 | required final String park, 249 | required final Coordinates coordinates}) = _$_Landmark; 250 | _Landmark._() : super._(); 251 | 252 | factory _Landmark.fromJson(Map json) = _$_Landmark.fromJson; 253 | 254 | @override 255 | int get id; 256 | @override 257 | String get name; 258 | @override 259 | String get imageName; 260 | @override 261 | String get state; 262 | @override 263 | String get park; 264 | @override 265 | Coordinates get coordinates; 266 | @override 267 | @JsonKey(ignore: true) 268 | _$$_LandmarkCopyWith<_$_Landmark> get copyWith => 269 | throw _privateConstructorUsedError; 270 | } 271 | 272 | Coordinates _$CoordinatesFromJson(Map json) { 273 | return _Coordinates.fromJson(json); 274 | } 275 | 276 | /// @nodoc 277 | mixin _$Coordinates { 278 | double get latitude => throw _privateConstructorUsedError; 279 | double get longitude => throw _privateConstructorUsedError; 280 | 281 | Map toJson() => throw _privateConstructorUsedError; 282 | @JsonKey(ignore: true) 283 | $CoordinatesCopyWith get copyWith => 284 | throw _privateConstructorUsedError; 285 | } 286 | 287 | /// @nodoc 288 | abstract class $CoordinatesCopyWith<$Res> { 289 | factory $CoordinatesCopyWith( 290 | Coordinates value, $Res Function(Coordinates) then) = 291 | _$CoordinatesCopyWithImpl<$Res, Coordinates>; 292 | @useResult 293 | $Res call({double latitude, double longitude}); 294 | } 295 | 296 | /// @nodoc 297 | class _$CoordinatesCopyWithImpl<$Res, $Val extends Coordinates> 298 | implements $CoordinatesCopyWith<$Res> { 299 | _$CoordinatesCopyWithImpl(this._value, this._then); 300 | 301 | // ignore: unused_field 302 | final $Val _value; 303 | // ignore: unused_field 304 | final $Res Function($Val) _then; 305 | 306 | @pragma('vm:prefer-inline') 307 | @override 308 | $Res call({ 309 | Object? latitude = null, 310 | Object? longitude = null, 311 | }) { 312 | return _then(_value.copyWith( 313 | latitude: null == latitude 314 | ? _value.latitude 315 | : latitude // ignore: cast_nullable_to_non_nullable 316 | as double, 317 | longitude: null == longitude 318 | ? _value.longitude 319 | : longitude // ignore: cast_nullable_to_non_nullable 320 | as double, 321 | ) as $Val); 322 | } 323 | } 324 | 325 | /// @nodoc 326 | abstract class _$$_CoordinatesCopyWith<$Res> 327 | implements $CoordinatesCopyWith<$Res> { 328 | factory _$$_CoordinatesCopyWith( 329 | _$_Coordinates value, $Res Function(_$_Coordinates) then) = 330 | __$$_CoordinatesCopyWithImpl<$Res>; 331 | @override 332 | @useResult 333 | $Res call({double latitude, double longitude}); 334 | } 335 | 336 | /// @nodoc 337 | class __$$_CoordinatesCopyWithImpl<$Res> 338 | extends _$CoordinatesCopyWithImpl<$Res, _$_Coordinates> 339 | implements _$$_CoordinatesCopyWith<$Res> { 340 | __$$_CoordinatesCopyWithImpl( 341 | _$_Coordinates _value, $Res Function(_$_Coordinates) _then) 342 | : super(_value, _then); 343 | 344 | @pragma('vm:prefer-inline') 345 | @override 346 | $Res call({ 347 | Object? latitude = null, 348 | Object? longitude = null, 349 | }) { 350 | return _then(_$_Coordinates( 351 | latitude: null == latitude 352 | ? _value.latitude 353 | : latitude // ignore: cast_nullable_to_non_nullable 354 | as double, 355 | longitude: null == longitude 356 | ? _value.longitude 357 | : longitude // ignore: cast_nullable_to_non_nullable 358 | as double, 359 | )); 360 | } 361 | } 362 | 363 | /// @nodoc 364 | @JsonSerializable() 365 | class _$_Coordinates implements _Coordinates { 366 | const _$_Coordinates({required this.latitude, required this.longitude}); 367 | 368 | factory _$_Coordinates.fromJson(Map json) => 369 | _$$_CoordinatesFromJson(json); 370 | 371 | @override 372 | final double latitude; 373 | @override 374 | final double longitude; 375 | 376 | @override 377 | String toString() { 378 | return 'Coordinates(latitude: $latitude, longitude: $longitude)'; 379 | } 380 | 381 | @override 382 | bool operator ==(dynamic other) { 383 | return identical(this, other) || 384 | (other.runtimeType == runtimeType && 385 | other is _$_Coordinates && 386 | (identical(other.latitude, latitude) || 387 | other.latitude == latitude) && 388 | (identical(other.longitude, longitude) || 389 | other.longitude == longitude)); 390 | } 391 | 392 | @JsonKey(ignore: true) 393 | @override 394 | int get hashCode => Object.hash(runtimeType, latitude, longitude); 395 | 396 | @JsonKey(ignore: true) 397 | @override 398 | @pragma('vm:prefer-inline') 399 | _$$_CoordinatesCopyWith<_$_Coordinates> get copyWith => 400 | __$$_CoordinatesCopyWithImpl<_$_Coordinates>(this, _$identity); 401 | 402 | @override 403 | Map toJson() { 404 | return _$$_CoordinatesToJson( 405 | this, 406 | ); 407 | } 408 | } 409 | 410 | abstract class _Coordinates implements Coordinates { 411 | const factory _Coordinates( 412 | {required final double latitude, 413 | required final double longitude}) = _$_Coordinates; 414 | 415 | factory _Coordinates.fromJson(Map json) = 416 | _$_Coordinates.fromJson; 417 | 418 | @override 419 | double get latitude; 420 | @override 421 | double get longitude; 422 | @override 423 | @JsonKey(ignore: true) 424 | _$$_CoordinatesCopyWith<_$_Coordinates> get copyWith => 425 | throw _privateConstructorUsedError; 426 | } 427 | -------------------------------------------------------------------------------- /flutter/macos/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; 13 | buildPhases = ( 14 | 33CC111E2044C6BF0003C045 /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = "Flutter Assemble"; 19 | productName = FLX; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 25 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 26 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 27 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 28 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 33CC10E52044A3C60003C045 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 33CC111A2044C6BA0003C045; 37 | remoteInfo = FLX; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXCopyFilesBuildPhase section */ 42 | 33CC110E2044A8840003C045 /* Bundle Framework */ = { 43 | isa = PBXCopyFilesBuildPhase; 44 | buildActionMask = 2147483647; 45 | dstPath = ""; 46 | dstSubfolderSpec = 10; 47 | files = ( 48 | ); 49 | name = "Bundle Framework"; 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXCopyFilesBuildPhase section */ 53 | 54 | /* Begin PBXFileReference section */ 55 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 56 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 57 | 33CC10ED2044A3C60003C045 /* swiftui_flutter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "swiftui_flutter.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 59 | 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 60 | 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 61 | 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; 62 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; 63 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; 64 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; 65 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; 66 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 67 | 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 68 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; 69 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 70 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 71 | /* End PBXFileReference section */ 72 | 73 | /* Begin PBXFrameworksBuildPhase section */ 74 | 33CC10EA2044A3C60003C045 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 33BA886A226E78AF003329D5 /* Configs */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */, 88 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 89 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 90 | 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, 91 | ); 92 | path = Configs; 93 | sourceTree = ""; 94 | }; 95 | 33CC10E42044A3C60003C045 = { 96 | isa = PBXGroup; 97 | children = ( 98 | 33FAB671232836740065AC1E /* Runner */, 99 | 33CEB47122A05771004F2AC0 /* Flutter */, 100 | 33CC10EE2044A3C60003C045 /* Products */, 101 | D73912EC22F37F3D000D13A0 /* Frameworks */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | 33CC10EE2044A3C60003C045 /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 33CC10ED2044A3C60003C045 /* swiftui_flutter.app */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 33CC11242044D66E0003C045 /* Resources */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 33CC10F22044A3C60003C045 /* Assets.xcassets */, 117 | 33CC10F42044A3C60003C045 /* MainMenu.xib */, 118 | 33CC10F72044A3C60003C045 /* Info.plist */, 119 | ); 120 | name = Resources; 121 | path = ..; 122 | sourceTree = ""; 123 | }; 124 | 33CEB47122A05771004F2AC0 /* Flutter */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 128 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 129 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, 130 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, 131 | ); 132 | path = Flutter; 133 | sourceTree = ""; 134 | }; 135 | 33FAB671232836740065AC1E /* Runner */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 139 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 140 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */, 141 | 33E51914231749380026EE4D /* Release.entitlements */, 142 | 33CC11242044D66E0003C045 /* Resources */, 143 | 33BA886A226E78AF003329D5 /* Configs */, 144 | ); 145 | path = Runner; 146 | sourceTree = ""; 147 | }; 148 | D73912EC22F37F3D000D13A0 /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | ); 152 | name = Frameworks; 153 | sourceTree = ""; 154 | }; 155 | /* End PBXGroup section */ 156 | 157 | /* Begin PBXNativeTarget section */ 158 | 33CC10EC2044A3C60003C045 /* Runner */ = { 159 | isa = PBXNativeTarget; 160 | buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; 161 | buildPhases = ( 162 | 33CC10E92044A3C60003C045 /* Sources */, 163 | 33CC10EA2044A3C60003C045 /* Frameworks */, 164 | 33CC10EB2044A3C60003C045 /* Resources */, 165 | 33CC110E2044A8840003C045 /* Bundle Framework */, 166 | 3399D490228B24CF009A79C7 /* ShellScript */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | 33CC11202044C79F0003C045 /* PBXTargetDependency */, 172 | ); 173 | name = Runner; 174 | productName = Runner; 175 | productReference = 33CC10ED2044A3C60003C045 /* swiftui_flutter.app */; 176 | productType = "com.apple.product-type.application"; 177 | }; 178 | /* End PBXNativeTarget section */ 179 | 180 | /* Begin PBXProject section */ 181 | 33CC10E52044A3C60003C045 /* Project object */ = { 182 | isa = PBXProject; 183 | attributes = { 184 | LastSwiftUpdateCheck = 0920; 185 | LastUpgradeCheck = 1300; 186 | ORGANIZATIONNAME = ""; 187 | TargetAttributes = { 188 | 33CC10EC2044A3C60003C045 = { 189 | CreatedOnToolsVersion = 9.2; 190 | LastSwiftMigration = 1100; 191 | ProvisioningStyle = Automatic; 192 | SystemCapabilities = { 193 | com.apple.Sandbox = { 194 | enabled = 1; 195 | }; 196 | }; 197 | }; 198 | 33CC111A2044C6BA0003C045 = { 199 | CreatedOnToolsVersion = 9.2; 200 | ProvisioningStyle = Manual; 201 | }; 202 | }; 203 | }; 204 | buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; 205 | compatibilityVersion = "Xcode 9.3"; 206 | developmentRegion = en; 207 | hasScannedForEncodings = 0; 208 | knownRegions = ( 209 | en, 210 | Base, 211 | ); 212 | mainGroup = 33CC10E42044A3C60003C045; 213 | productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; 214 | projectDirPath = ""; 215 | projectRoot = ""; 216 | targets = ( 217 | 33CC10EC2044A3C60003C045 /* Runner */, 218 | 33CC111A2044C6BA0003C045 /* Flutter Assemble */, 219 | ); 220 | }; 221 | /* End PBXProject section */ 222 | 223 | /* Begin PBXResourcesBuildPhase section */ 224 | 33CC10EB2044A3C60003C045 /* Resources */ = { 225 | isa = PBXResourcesBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 229 | 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXResourcesBuildPhase section */ 234 | 235 | /* Begin PBXShellScriptBuildPhase section */ 236 | 3399D490228B24CF009A79C7 /* ShellScript */ = { 237 | isa = PBXShellScriptBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | ); 241 | inputFileListPaths = ( 242 | ); 243 | inputPaths = ( 244 | ); 245 | outputFileListPaths = ( 246 | ); 247 | outputPaths = ( 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | shellPath = /bin/sh; 251 | shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; 252 | }; 253 | 33CC111E2044C6BF0003C045 /* ShellScript */ = { 254 | isa = PBXShellScriptBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | inputFileListPaths = ( 259 | Flutter/ephemeral/FlutterInputs.xcfilelist, 260 | ); 261 | inputPaths = ( 262 | Flutter/ephemeral/tripwire, 263 | ); 264 | outputFileListPaths = ( 265 | Flutter/ephemeral/FlutterOutputs.xcfilelist, 266 | ); 267 | outputPaths = ( 268 | ); 269 | runOnlyForDeploymentPostprocessing = 0; 270 | shellPath = /bin/sh; 271 | shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; 272 | }; 273 | /* End PBXShellScriptBuildPhase section */ 274 | 275 | /* Begin PBXSourcesBuildPhase section */ 276 | 33CC10E92044A3C60003C045 /* Sources */ = { 277 | isa = PBXSourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 281 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 282 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | /* End PBXSourcesBuildPhase section */ 287 | 288 | /* Begin PBXTargetDependency section */ 289 | 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { 290 | isa = PBXTargetDependency; 291 | target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; 292 | targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; 293 | }; 294 | /* End PBXTargetDependency section */ 295 | 296 | /* Begin PBXVariantGroup section */ 297 | 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { 298 | isa = PBXVariantGroup; 299 | children = ( 300 | 33CC10F52044A3C60003C045 /* Base */, 301 | ); 302 | name = MainMenu.xib; 303 | path = Runner; 304 | sourceTree = ""; 305 | }; 306 | /* End PBXVariantGroup section */ 307 | 308 | /* Begin XCBuildConfiguration section */ 309 | 338D0CE9231458BD00FA5F75 /* Profile */ = { 310 | isa = XCBuildConfiguration; 311 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 312 | buildSettings = { 313 | ALWAYS_SEARCH_USER_PATHS = NO; 314 | CLANG_ANALYZER_NONNULL = YES; 315 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 316 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 317 | CLANG_CXX_LIBRARY = "libc++"; 318 | CLANG_ENABLE_MODULES = YES; 319 | CLANG_ENABLE_OBJC_ARC = YES; 320 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 321 | CLANG_WARN_BOOL_CONVERSION = YES; 322 | CLANG_WARN_CONSTANT_CONVERSION = YES; 323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 325 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 326 | CLANG_WARN_EMPTY_BODY = YES; 327 | CLANG_WARN_ENUM_CONVERSION = YES; 328 | CLANG_WARN_INFINITE_RECURSION = YES; 329 | CLANG_WARN_INT_CONVERSION = YES; 330 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 334 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 335 | CODE_SIGN_IDENTITY = "-"; 336 | COPY_PHASE_STRIP = NO; 337 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 338 | ENABLE_NS_ASSERTIONS = NO; 339 | ENABLE_STRICT_OBJC_MSGSEND = YES; 340 | GCC_C_LANGUAGE_STANDARD = gnu11; 341 | GCC_NO_COMMON_BLOCKS = YES; 342 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 343 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 344 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 345 | GCC_WARN_UNUSED_FUNCTION = YES; 346 | GCC_WARN_UNUSED_VARIABLE = YES; 347 | MACOSX_DEPLOYMENT_TARGET = 10.11; 348 | MTL_ENABLE_DEBUG_INFO = NO; 349 | SDKROOT = macosx; 350 | SWIFT_COMPILATION_MODE = wholemodule; 351 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 352 | }; 353 | name = Profile; 354 | }; 355 | 338D0CEA231458BD00FA5F75 /* Profile */ = { 356 | isa = XCBuildConfiguration; 357 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 358 | buildSettings = { 359 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 360 | CLANG_ENABLE_MODULES = YES; 361 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 362 | CODE_SIGN_STYLE = Automatic; 363 | COMBINE_HIDPI_IMAGES = YES; 364 | INFOPLIST_FILE = Runner/Info.plist; 365 | LD_RUNPATH_SEARCH_PATHS = ( 366 | "$(inherited)", 367 | "@executable_path/../Frameworks", 368 | ); 369 | PROVISIONING_PROFILE_SPECIFIER = ""; 370 | SWIFT_VERSION = 5.0; 371 | }; 372 | name = Profile; 373 | }; 374 | 338D0CEB231458BD00FA5F75 /* Profile */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | CODE_SIGN_STYLE = Manual; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | }; 380 | name = Profile; 381 | }; 382 | 33CC10F92044A3C60003C045 /* Debug */ = { 383 | isa = XCBuildConfiguration; 384 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 385 | buildSettings = { 386 | ALWAYS_SEARCH_USER_PATHS = NO; 387 | CLANG_ANALYZER_NONNULL = YES; 388 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 389 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 390 | CLANG_CXX_LIBRARY = "libc++"; 391 | CLANG_ENABLE_MODULES = YES; 392 | CLANG_ENABLE_OBJC_ARC = YES; 393 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 394 | CLANG_WARN_BOOL_CONVERSION = YES; 395 | CLANG_WARN_CONSTANT_CONVERSION = YES; 396 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 397 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 398 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 399 | CLANG_WARN_EMPTY_BODY = YES; 400 | CLANG_WARN_ENUM_CONVERSION = YES; 401 | CLANG_WARN_INFINITE_RECURSION = YES; 402 | CLANG_WARN_INT_CONVERSION = YES; 403 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 404 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 406 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 407 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 408 | CODE_SIGN_IDENTITY = "-"; 409 | COPY_PHASE_STRIP = NO; 410 | DEBUG_INFORMATION_FORMAT = dwarf; 411 | ENABLE_STRICT_OBJC_MSGSEND = YES; 412 | ENABLE_TESTABILITY = YES; 413 | GCC_C_LANGUAGE_STANDARD = gnu11; 414 | GCC_DYNAMIC_NO_PIC = NO; 415 | GCC_NO_COMMON_BLOCKS = YES; 416 | GCC_OPTIMIZATION_LEVEL = 0; 417 | GCC_PREPROCESSOR_DEFINITIONS = ( 418 | "DEBUG=1", 419 | "$(inherited)", 420 | ); 421 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 422 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 423 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 424 | GCC_WARN_UNUSED_FUNCTION = YES; 425 | GCC_WARN_UNUSED_VARIABLE = YES; 426 | MACOSX_DEPLOYMENT_TARGET = 10.11; 427 | MTL_ENABLE_DEBUG_INFO = YES; 428 | ONLY_ACTIVE_ARCH = YES; 429 | SDKROOT = macosx; 430 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 431 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 432 | }; 433 | name = Debug; 434 | }; 435 | 33CC10FA2044A3C60003C045 /* Release */ = { 436 | isa = XCBuildConfiguration; 437 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 438 | buildSettings = { 439 | ALWAYS_SEARCH_USER_PATHS = NO; 440 | CLANG_ANALYZER_NONNULL = YES; 441 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 442 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 443 | CLANG_CXX_LIBRARY = "libc++"; 444 | CLANG_ENABLE_MODULES = YES; 445 | CLANG_ENABLE_OBJC_ARC = YES; 446 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 447 | CLANG_WARN_BOOL_CONVERSION = YES; 448 | CLANG_WARN_CONSTANT_CONVERSION = YES; 449 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 450 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 451 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 452 | CLANG_WARN_EMPTY_BODY = YES; 453 | CLANG_WARN_ENUM_CONVERSION = YES; 454 | CLANG_WARN_INFINITE_RECURSION = YES; 455 | CLANG_WARN_INT_CONVERSION = YES; 456 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 457 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 459 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 460 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 461 | CODE_SIGN_IDENTITY = "-"; 462 | COPY_PHASE_STRIP = NO; 463 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 464 | ENABLE_NS_ASSERTIONS = NO; 465 | ENABLE_STRICT_OBJC_MSGSEND = YES; 466 | GCC_C_LANGUAGE_STANDARD = gnu11; 467 | GCC_NO_COMMON_BLOCKS = YES; 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 471 | GCC_WARN_UNUSED_FUNCTION = YES; 472 | GCC_WARN_UNUSED_VARIABLE = YES; 473 | MACOSX_DEPLOYMENT_TARGET = 10.11; 474 | MTL_ENABLE_DEBUG_INFO = NO; 475 | SDKROOT = macosx; 476 | SWIFT_COMPILATION_MODE = wholemodule; 477 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 478 | }; 479 | name = Release; 480 | }; 481 | 33CC10FC2044A3C60003C045 /* Debug */ = { 482 | isa = XCBuildConfiguration; 483 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 484 | buildSettings = { 485 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 486 | CLANG_ENABLE_MODULES = YES; 487 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 488 | CODE_SIGN_STYLE = Automatic; 489 | COMBINE_HIDPI_IMAGES = YES; 490 | INFOPLIST_FILE = Runner/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = ( 492 | "$(inherited)", 493 | "@executable_path/../Frameworks", 494 | ); 495 | PROVISIONING_PROFILE_SPECIFIER = ""; 496 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 497 | SWIFT_VERSION = 5.0; 498 | }; 499 | name = Debug; 500 | }; 501 | 33CC10FD2044A3C60003C045 /* Release */ = { 502 | isa = XCBuildConfiguration; 503 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 504 | buildSettings = { 505 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 506 | CLANG_ENABLE_MODULES = YES; 507 | CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; 508 | CODE_SIGN_STYLE = Automatic; 509 | COMBINE_HIDPI_IMAGES = YES; 510 | INFOPLIST_FILE = Runner/Info.plist; 511 | LD_RUNPATH_SEARCH_PATHS = ( 512 | "$(inherited)", 513 | "@executable_path/../Frameworks", 514 | ); 515 | PROVISIONING_PROFILE_SPECIFIER = ""; 516 | SWIFT_VERSION = 5.0; 517 | }; 518 | name = Release; 519 | }; 520 | 33CC111C2044C6BA0003C045 /* Debug */ = { 521 | isa = XCBuildConfiguration; 522 | buildSettings = { 523 | CODE_SIGN_STYLE = Manual; 524 | PRODUCT_NAME = "$(TARGET_NAME)"; 525 | }; 526 | name = Debug; 527 | }; 528 | 33CC111D2044C6BA0003C045 /* Release */ = { 529 | isa = XCBuildConfiguration; 530 | buildSettings = { 531 | CODE_SIGN_STYLE = Automatic; 532 | PRODUCT_NAME = "$(TARGET_NAME)"; 533 | }; 534 | name = Release; 535 | }; 536 | /* End XCBuildConfiguration section */ 537 | 538 | /* Begin XCConfigurationList section */ 539 | 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 33CC10F92044A3C60003C045 /* Debug */, 543 | 33CC10FA2044A3C60003C045 /* Release */, 544 | 338D0CE9231458BD00FA5F75 /* Profile */, 545 | ); 546 | defaultConfigurationIsVisible = 0; 547 | defaultConfigurationName = Release; 548 | }; 549 | 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { 550 | isa = XCConfigurationList; 551 | buildConfigurations = ( 552 | 33CC10FC2044A3C60003C045 /* Debug */, 553 | 33CC10FD2044A3C60003C045 /* Release */, 554 | 338D0CEA231458BD00FA5F75 /* Profile */, 555 | ); 556 | defaultConfigurationIsVisible = 0; 557 | defaultConfigurationName = Release; 558 | }; 559 | 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { 560 | isa = XCConfigurationList; 561 | buildConfigurations = ( 562 | 33CC111C2044C6BA0003C045 /* Debug */, 563 | 33CC111D2044C6BA0003C045 /* Release */, 564 | 338D0CEB231458BD00FA5F75 /* Profile */, 565 | ); 566 | defaultConfigurationIsVisible = 0; 567 | defaultConfigurationName = Release; 568 | }; 569 | /* End XCConfigurationList section */ 570 | }; 571 | rootObject = 33CC10E52044A3C60003C045 /* Project object */; 572 | } 573 | -------------------------------------------------------------------------------- /flutter/macos/Runner/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | --------------------------------------------------------------------------------