├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug.yaml │ ├── documentation.yaml │ └── feature.yaml ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yaml └── workflows │ ├── build.yaml │ └── no-response.yaml ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── example ├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── example │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable-v21 │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── 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 │ │ │ │ ├── values-night │ │ │ │ └── styles.xml │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── 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-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ ├── main.dart │ └── sample_animation.dart ├── macos │ ├── .gitignore │ ├── Flutter │ │ ├── Flutter-Debug.xcconfig │ │ ├── Flutter-Release.xcconfig │ │ └── GeneratedPluginRegistrant.swift │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── app_icon_1024.png │ │ │ ├── app_icon_128.png │ │ │ ├── app_icon_16.png │ │ │ ├── app_icon_256.png │ │ │ ├── app_icon_32.png │ │ │ ├── app_icon_512.png │ │ │ └── app_icon_64.png │ │ ├── Base.lproj │ │ └── MainMenu.xib │ │ ├── Configs │ │ ├── AppInfo.xcconfig │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── Warnings.xcconfig │ │ ├── DebugProfile.entitlements │ │ ├── Info.plist │ │ ├── MainFlutterWindow.swift │ │ └── Release.entitlements ├── pubspec.yaml ├── test │ └── widget_test.dart └── web │ ├── favicon.png │ ├── icons │ ├── Icon-192.png │ └── Icon-512.png │ ├── index.html │ └── manifest.json ├── img └── screen_recorder.svg ├── lib ├── screen_recorder.dart └── src │ ├── exporter.dart │ ├── frame.dart │ └── screen_recorder.dart ├── pubspec.yaml └── test └── screen_recorder_test.dart /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: Baseflow 2 | custom: https://baseflow.com/contact -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yaml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug 2 | description: Something is crashing or not working as intended 3 | title: "[Field name or General]: " 4 | labels: [bug] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for the bug you encountered. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: input 14 | attributes: 15 | label: Package/Plugin version 16 | description: Version number 17 | placeholder: '1.0.0' 18 | validations: 19 | required: true 20 | - type: checkboxes 21 | attributes: 22 | label: Platforms 23 | description: Please select in whats platform you tested this bug. 24 | options: 25 | - label: Android 26 | - label: iOS 27 | - label: Linux 28 | - label: MacOS 29 | - label: Web 30 | - label: Windows 31 | - type: textarea 32 | attributes: 33 | label: Flutter doctor 34 | description: Paste the output of running `flutter doctor -v` 35 | value: | 36 | <details> 37 | <summary>Flutter doctor</summary> 38 | 39 | <!-- Paste the output below inside ``` and ``` --> 40 | ```bash 41 | 42 | ``` 43 | 44 | </details> 45 | validations: 46 | required: true 47 | - type: textarea 48 | attributes: 49 | label: Minimal code example 50 | description: | 51 | Create a minimal code example to reproduce the issue. 52 | Try to not use external packages not related with flutter form builder ecosystem 53 | Without this we will unlikely be able to progress on the issue, and because of that 54 | we regretfully will have to close it. 55 | value: | 56 | <details> 57 | <summary>Code sample</summary> 58 | 59 | <!-- Paste the output below inside ``` and ``` --> 60 | 61 | ```dart 62 | 63 | ``` 64 | 65 | </details> 66 | validations: 67 | required: true 68 | - type: textarea 69 | attributes: 70 | label: Current Behavior 71 | description: A concise description of what you're experiencing. 72 | validations: 73 | required: true 74 | - type: textarea 75 | attributes: 76 | label: Expected Behavior 77 | description: A concise description of what you expected to happen. 78 | validations: 79 | required: true 80 | - type: textarea 81 | attributes: 82 | label: Steps To Reproduce 83 | description: Steps to reproduce the behavior. 84 | placeholder: | 85 | 1. In this environment... 86 | 2. With this config... 87 | 3. Run '...' 88 | 4. See error... 89 | validations: 90 | required: true 91 | - type: textarea 92 | attributes: 93 | label: Aditional information 94 | placeholder: Can add images, videos, more context, etc. 95 | validations: 96 | required: false 97 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation.yaml: -------------------------------------------------------------------------------- 1 | name: 📘 Documentation 2 | description: You want to report something that is wrong or missing from the documentation 3 | labels: [documentation] 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: Describe the change you would like to see 8 | placeholder: | 9 | A clear and concise description of the bug or documentation you feel is missing. 10 | For example: The Technical Reference does not include information about the FormBuilderFilterChip widget. 11 | render: Markdown 12 | validations: 13 | required: true 14 | - type: textarea 15 | attributes: 16 | label: How would the suggested change make the documentation more useful? 17 | placeholder: | 18 | Provide context for how the requested change would make the docs easier to use and improve your ability to develop successful applications with this packages. 19 | For example: It's hard to know a method exists or understand its use when you have to search through the code base to learn about it. Properly documenting it in the Technical Reference makes it easier for me to know what the flutter_fom_builder is (and is not capable of). 20 | render: Markdown 21 | validations: 22 | required: false 23 | - type: textarea 24 | attributes: 25 | label: Aditional information 26 | placeholder: Can add images, videos, more context, etc. 27 | validations: 28 | required: false -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yaml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature request 2 | description: Suggest new feature or request for this project 3 | title: "[Field name or General]: <title>" 4 | labels: [enhancement] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for the feature you requested. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: input 14 | attributes: 15 | label: Package/Plugin version 16 | description: Version number 17 | placeholder: '1.0.0' 18 | validations: 19 | required: true 20 | - type: textarea 21 | attributes: 22 | label: What you'd like to happen 23 | render: Markdown 24 | validations: 25 | required: true 26 | - type: textarea 27 | attributes: 28 | label: Alternatives you've considered 29 | render: Markdown 30 | validations: 31 | required: false 32 | - type: textarea 33 | attributes: 34 | label: Aditional information 35 | placeholder: Can add images, videos, more context, etc. 36 | validations: 37 | required: false -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | *Replace this paragraph with a short description of what issue this pull request (PR) solves and provide a description of the change. Consider including before/after screenshots.* 2 | 3 | *List at least one fixed issue.* 4 | 5 | ## Pre-launch Checklist 6 | 7 | - [ ] I made sure the project builds. 8 | - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. 9 | - [ ] I updated `pubspec.yaml` with an appropriate new version according to the [pub versioning philosophy], or this PR is does not need version changes. 10 | - [ ] I updated `CHANGELOG.md` to add a description of the change. 11 | - [ ] I updated/added relevant documentation (doc comments with `///`). 12 | - [ ] I rebased onto `main`. 13 | - [ ] I added new tests to check the change I am making, or this PR does not need tests. 14 | - [ ] I made sure all existing and new tests are passing. 15 | - [ ] I ran `dart format .` and committed any changes. 16 | - [ ] I ran `flutter analyze` and fixed any errors. 17 | 18 | <!-- References --> 19 | [Contributor Guide]: https://github.com/Baseflow/screenrecorder/blob/main/CONTRIBUTING.md 20 | [pub versioning philosophy]: https://dart.dev/tools/pub/versioning -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | enable-beta-ecosystems: true 3 | updates: 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | schedule: 7 | interval: "daily" 8 | - package-ecosystem: "pub" 9 | directory: "/" 10 | schedule: 11 | interval: "daily" -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: CI & CD 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | push: 7 | branches: [develop, main] 8 | tags: 9 | - "v[0-9]+.[0-9]+.[0-9]+*" 10 | 11 | pull_request: 12 | branches: [develop, main] 13 | 14 | # This ensures that previous jobs for the PR are canceled when PR is updated 15 | concurrency: 16 | group: ${{ github.workflow }}-${{ github.ref }} 17 | cancel-in-progress: true 18 | 19 | jobs: 20 | build: 21 | name: Build package & run tests 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - name: Checkout repository 26 | uses: actions/checkout@v4 27 | with: 28 | fetch-depth: 1 # Use shallow clone for faster checkout 29 | 30 | - name: Check broken links 31 | uses: JustinBeckwith/linkinator-action@v1 32 | with: 33 | paths: "**/*.md" 34 | 35 | - name: Set up Flutter 36 | uses: subosito/flutter-action@v2 37 | with: 38 | channel: "stable" 39 | architecture: x64 40 | cache: true 41 | 42 | - name: Install dependencies 43 | run: dart pub get 44 | 45 | - name: Format code 46 | run: dart format --set-exit-if-changed . 47 | 48 | - name: Analyze static code 49 | run: dart analyze 50 | 51 | - name: Run tests 52 | run: flutter test --no-pub --coverage 53 | 54 | - name: Check publish warnings 55 | run: dart pub publish --dry-run 56 | 57 | example: 58 | name: Build example app 59 | runs-on: ubuntu-latest 60 | 61 | steps: 62 | - name: Checkout repository 63 | uses: actions/checkout@v4 64 | with: 65 | fetch-depth: 1 # Use shallow clone for faster checkout 66 | 67 | - name: Set up Flutter 68 | uses: subosito/flutter-action@v2 69 | with: 70 | channel: "stable" 71 | architecture: x64 72 | cache: true 73 | 74 | - name: Install dependencies 75 | run: dart pub get 76 | 77 | - name: Build example 78 | run: flutter build appbundle --debug 79 | working-directory: example 80 | 81 | deployment: 82 | if: ${{ github.ref_type == 'tag' }} 83 | needs: [build, example] 84 | name: Deploy package 85 | permissions: 86 | id-token: write 87 | runs-on: ubuntu-latest 88 | steps: 89 | - name: Checkout repository 90 | uses: actions/checkout@v4 91 | with: 92 | fetch-depth: 1 # Use shallow clone for faster checkout 93 | 94 | - name: Set up Dart 95 | uses: dart-lang/setup-dart@v1 96 | 97 | - name: Set up Flutter 98 | uses: subosito/flutter-action@v2 99 | with: 100 | channel: "stable" 101 | architecture: x64 102 | cache: true 103 | 104 | - name: Install dependencies 105 | run: dart pub get 106 | 107 | - name: Publish package 108 | run: dart pub publish -v -f 109 | -------------------------------------------------------------------------------- /.github/workflows/no-response.yaml: -------------------------------------------------------------------------------- 1 | name: 'No Response' 2 | 3 | # Both `issue_comment` and `scheduled` event types are required for this Action 4 | # to work properly. 5 | on: 6 | issue_comment: 7 | types: [created] 8 | schedule: 9 | # Schedule for five minutes after the hour, every hour 10 | - cron: '5 * * * *' 11 | 12 | # By specifying the access of one of the scopes, all of those that are not 13 | # specified are set to 'none'. 14 | permissions: 15 | issues: write 16 | 17 | jobs: 18 | stale: 19 | runs-on: ubuntu-latest 20 | steps: 21 | # At Baseflow, we mark issues with the `status: needs more info` label when more information is 22 | # required to be able to solve an issue. When nobody (either original poster or other community 23 | # members) respond to the issue within 14 days the issue will be closed. 24 | # 25 | # To automate this process we utilize the [stale](https://github.com/actions/stale) GitHub action. 26 | # However the [stale](https://github.com/actions/stale) action requires an issue to be marked specifically 27 | # as "stale" before it will consider an issue to be closed. Therefore we utilize the following 28 | # configuration: 29 | # 1. Set the `stale-issue-label` parameter to `status: needs more info`. This will inform the stale action that all 30 | # issues marked with this particular label to be stale (note that Baseflow manually adds this label after initial triaging). 31 | # 2. Set the `days-before-stale` parameter to `-1`. This will prevent the [stale](https://github.com/actions/stale) action 32 | # from automatically marking issues as being "stale". As mentioned in step 1, at Baseflow we want to manually 33 | # triage the issue and mark it to require more information. 34 | # 3. Set the `close-issue-label` parameter to `status: closed (missing info)` to easily allow us to track issues closed due 35 | # to a lack of information. 36 | # issue is closed. This will make sure the label is automatically removed when the issue is re-opened (most likely 37 | # this happend because someone added more information). 38 | # 4. Set the `days-before-close` parameter to `14` to indicate after how many days, since marking the issue with 39 | # the `status: needs more info` label, the issue should be closed automatically. 40 | # 5. Set the `close-issue-message` parameter with a text that will be placed as a comment to the respective issue that 41 | # is closed to explain why the issue was closed. 42 | - uses: actions/stale@v9 43 | with: 44 | stale-issue-label: 'status: needs more info' 45 | days-before-stale: -1 46 | close-issue-label: 'status: closed (missing info)' 47 | close-issue-message: > 48 | Without additional information, we are unfortunately not able to resolve this issue. 49 | Therefore, we reluctantly closed this issue for now. 50 | If you run into this issue later, feel free to file a new issue with a reference to this issue. 51 | Add a description of detailed steps to reproduce, expected and current behaviour, logs and the output of 'flutter doctor -v'. 52 | Thanks for your contribution. 53 | days-before-close: 14 -------------------------------------------------------------------------------- /.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 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | build/ 32 | 33 | # Android related 34 | **/android/**/gradle-wrapper.jar 35 | **/android/.gradle 36 | **/android/captures/ 37 | **/android/gradlew 38 | **/android/gradlew.bat 39 | **/android/local.properties 40 | **/android/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Flutter.podspec 62 | **/ios/Flutter/Generated.xcconfig 63 | **/ios/Flutter/app.flx 64 | **/ios/Flutter/app.zip 65 | **/ios/Flutter/flutter_assets/ 66 | **/ios/Flutter/flutter_export_environment.sh 67 | **/ios/ServiceDefinitions.json 68 | **/ios/Runner/GeneratedPluginRegistrant.* 69 | 70 | # Exceptions to above rules. 71 | !**/ios/**/default.mode1v3 72 | !**/ios/**/default.mode2v3 73 | !**/ios/**/default.pbxuser 74 | !**/ios/**/default.perspectivev3 75 | 76 | pubspec.lock -------------------------------------------------------------------------------- /.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 and should not be manually edited. 5 | 6 | version: 7 | revision: a29104a69b102a7485cd00d358eaeab219d258ab 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.3.0] 2 | 3 | * Add support transparency. 4 | * Updated the example project to last flutter changes. 5 | * `Exporter` class exposes now `frames`. 6 | * Bump `image` dependency to ^4.2.0 7 | 8 | ## [0.2.0] 9 | 10 | * `Exporter` class exposes now `exportGif` and `exportFrames`. 11 | * Updated the example project using an AnimatedContainer to have a more heavy output. 12 | 13 | ## [0.1.1] 14 | 15 | * Fix [#11](https://github.com/ueman/screenrecorder/issues/11) 16 | * Custom exporters can actually be used 17 | 18 | ## [0.1.0] 19 | 20 | * require at least Flutter >=3.4.0-34.1.pre 21 | * use `toImageSync` instead of async `toImage` 22 | * Add ability to use different `Exporter` to export the recording in different formats. For now, only `gif`s are supported. 23 | 24 | ## [0.0.3] 25 | 26 | * fix background color 27 | * update example 28 | 29 | ## [0.0.2] 30 | 31 | * Better Readme 32 | * Some more configuration options 33 | 34 | ## [0.0.1] 35 | 36 | * Initial draft. Pretty WIP and highly experimental 37 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the Flutter screenrecorder plugin 2 | 3 | ## What you will need 4 | 5 | * A Linux, Mac OS X, or Windows machine (note: to run and compile iOS-specific parts you'll need access to a Mac OS X machine); 6 | * git (used for source version control, installation instructions can be found [here](https://git-scm.com/)); 7 | * The Flutter SDK (installation instructions can be found [here](https://flutter.io/get-started/install/)); 8 | * A personal GitHub account (if you don't have one, you can sign up for free [here](https://github.com/)) 9 | 10 | ## Setting up your development environment 11 | 12 | * Fork `https://github.com/Baseflow/screenrecorder` into your own GitHub account. If you already have a fork and moving to a new computer, make sure you update your fork. 13 | * If you haven't configured your machine with an SSH key that's known to GitHub, then 14 | follow [GitHub's directions](https://help.github.com/articles/generating-ssh-keys/) 15 | to generate an SSH key. 16 | * Clone your forked repo on your local development machine: `git clone git@github.com:<your_name_here>/screenrecorder.git` 17 | * Change into the `screenrecorder` directory: `cd screenrecorder` 18 | * Add an upstream to the original repo, so that fetches from the master repository and not your clone: `git remote add upstream git@github.com:Baseflow/screenrecorder.git` 19 | 20 | ## Running the example project 21 | 22 | * Change into the example directory: `cd example` 23 | * Run the App: `flutter run` 24 | 25 | ## Contribute 26 | 27 | We really appreciate contributions via GitHub pull requests. To contribute take the following steps: 28 | 29 | * Make sure you are up to date with the latest code on the master: 30 | * `git fetch upstream` 31 | * `git checkout upstream/main -b <name_of_your_branch>` 32 | * Apply your changes 33 | * Verify your changes and fix potential warnings/ errors: 34 | * Check formatting: `flutter format .` 35 | * Run static analyses: `flutter analyze` 36 | * Run unit-tests: `flutter test` 37 | * Commit your changes: `git commit -am "<your informative commit message>"` 38 | * Push changes to your fork: `git push origin <name_of_your_branch>` 39 | 40 | Send us your pull request: 41 | 42 | * Go to `https://github.com/Baseflow/screenrecorder` and click the "Compare & pull request" button. 43 | 44 | Please make sure you solved all warnings and errors reported by the static code analyses and that you fill in the full pull request template. Failing to do so will result in us asking you to fix it. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2021 Jonas Uekötter 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | <p align="center"> 2 | <img src="https://raw.githubusercontent.com/ueman/screenrecorder/main/img/screen_recorder.svg"> 3 | </p> 4 | 5 | <p align="center"> 6 | <a href="https://pub.dev/packages/screen_recorder"><img src="https://img.shields.io/pub/v/screen_recorder.svg" alt="pub.dev"></a> 7 | <!-- 8 | <a href="https://github.com/ueman/feedback/actions?query=workflow%3Abuild"><img src="https://github.com/ueman/feedback/workflows/build/badge.svg?branch=master" alt="GitHub Workflow Status"></a> 9 | <a href="https://codecov.io/gh/ueman/feedback"><img src="https://codecov.io/gh/ueman/feedback/branch/master/graph/badge.svg" alt="code coverage"></a> 10 | --> 11 | <a href="https://github.com/ueman#sponsor-me"><img src="https://img.shields.io/github/sponsors/ueman" alt="Sponsoring"></a> 12 | <a href="https://pub.dev/packages/screen_recorder/score"><img src="https://img.shields.io/pub/likes/screen_recorder" alt="likes"></a> 13 | <a href="https://pub.dev/packages/screen_recorder/score"><img src="https://img.shields.io/pub/popularity/screen_recorder" alt="popularity"></a> 14 | <a href="https://pub.dev/packages/screen_recorder/score"><img src="https://img.shields.io/pub/points/screen_recorder" alt="pub points"></a> 15 | </p> 16 | 17 | ---- 18 | 19 | > 🚧 This is highly experimental! 🚧 20 | > 21 | > 🚧 API is subject to change! 🚧 22 | 23 | This is a package to create recordings of Flutter widgets. 24 | The recordings can be exported as GIFs. 25 | 26 | This is pure Flutter/Dart implementation without any dependencies on native 27 | or platform code. Thus it runs on all supported platforms. 28 | 29 | Please note, that the encoding of the GIF takes a lot of time. On web it is basically useless because it takes so much time. 30 | 31 | ## 🚀 Getting Started 32 | 33 | ### Setup 34 | 35 | First, you will need to add `screen_recorder` to your `pubspec.yaml`: 36 | 37 | ```yaml 38 | dependencies: 39 | flutter: 40 | sdk: flutter 41 | screen_recorder: x.y.z # use the latest version found on pub.dev 42 | ``` 43 | 44 | Then, run `flutter packages get` in your terminal. 45 | 46 | ## Example 47 | 48 | Wrap your widget which should be recorded in a `ScreenRecorder`: 49 | 50 | ```dart 51 | ScreenRecorder( 52 | height: 200, 53 | width: 200, 54 | background: Colors.white, 55 | controller: ScreenRecorderController( 56 | pixelRatio: 0.5, 57 | skipFramesBetweenCaptures: 2, 58 | ), 59 | child: // child which should be recorded 60 | ); 61 | ``` 62 | 63 | Then use `ScreenRecorderController.start()` to start recording and 64 | `ScreenRecorderController.stop()` to stop the recording. 65 | `final gif = await ScreenRecorderController.export()` gives you the result which can be written to disk. 66 | 67 | A complete example can be found [here](https://pub.dev/packages/screen_recorder/example). 68 | 69 | ## ⚠️ Known issues and limitations 70 | 71 | - Platform views are invisible in screenshots (like [webview](https://pub.dev/packages/webview_flutter) or [Google Maps](https://pub.dev/packages/google_maps_flutter)). For further details, see this [Flutter issue](https://github.com/flutter/flutter/issues/25306) and [this issue](https://github.com/flutter/flutter/issues/102866). Please give a 👍 to those issues in order to raise awareness and the prio of those issues. 72 | - Web only works with Flutter's CanvasKit Renderer, for more information see [Flutter Web Renderer docs](https://flutter.dev/docs/development/tools/web-renderers). 73 | - This package does not and will not support audio until it is possible in a pure Dart/Flutter environment. 74 | - This package does not and will not support exporting as a video until it is possible in a pure Dart/Flutter environment. 75 | 76 | ## Convert gif to video 77 | 78 | In order to convert the gif to a video, you can try one of the following libraries. Please note, that compatibility was not tested. 79 | 80 | | Library | Stats | 81 | |---------|-------| 82 | | [ffmpeg_kit_flutter](https://pub.dev/packages/ffmpeg_kit_flutter) | <a href="https://pub.dev/packages/ffmpeg_kit_flutter/score"><img src="https://img.shields.io/pub/likes/ffmpeg_kit_flutter" alt="likes"></a> <a href="https://pub.dev/packages/ffmpeg_kit_flutter/score"><img src="https://img.shields.io/pub/popularity/ffmpeg_kit_flutter" alt="popularity"></a> <a href="https://pub.dev/packages/ffmpeg_kit_flutter/score"><img src="https://img.shields.io/pub/points/ffmpeg_kit_flutter" alt="pub points"></a> | 83 | | [flutter_video_compress](https://pub.dev/packages/flutter_video_compress) | <a href="https://pub.dev/packages/flutter_video_compress/score"><img src="https://img.shields.io/pub/likes/flutter_video_compress" alt="likes"></a> <a href="https://pub.dev/packages/flutter_video_compress/score"><img src="https://img.shields.io/pub/popularity/flutter_video_compress" alt="popularity"></a> <a href="https://pub.dev/packages/flutter_video_compress/score"><img src="https://img.shields.io/pub/points/flutter_video_compress" alt="pub points"></a> | 84 | | [video_editor](https://pub.dev/packages/video_editor) | <a href="https://pub.dev/packages/video_editor/score"><img src="https://img.shields.io/pub/likes/video_editor" alt="likes"></a> <a href="https://pub.dev/packages/video_editor/score"><img src="https://img.shields.io/pub/popularity/video_editor" alt="popularity"></a> <a href="https://pub.dev/packages/video_editor/score"><img src="https://img.shields.io/pub/points/video_editor" alt="pub points"></a> | 85 | | [video_trimmer](https://pub.dev/packages/video_trimmer) | <a href="https://pub.dev/packages/video_trimmer/score"><img src="https://img.shields.io/pub/likes/video_trimmer" alt="likes"></a> <a href="https://pub.dev/packages/video_trimmer/score"><img src="https://img.shields.io/pub/popularity/video_trimmer" alt="popularity"></a> <a href="https://pub.dev/packages/video_trimmer/score"><img src="https://img.shields.io/pub/points/video_trimmer" alt="pub points"></a> | 86 | | [video_compress](https://pub.dev/packages/video_compress) | <a href="https://pub.dev/packages/video_compress/score"><img src="https://img.shields.io/pub/likes/video_compress" alt="likes"></a> <a href="https://pub.dev/packages/video_compress/score"><img src="https://img.shields.io/pub/popularity/video_compress" alt="popularity"></a> <a href="https://pub.dev/packages/video_compress/score"><img src="https://img.shields.io/pub/points/video_compress" alt="pub points"></a> | 87 | 88 | ## 📣 About the author 89 | 90 | [![GitHub followers](https://img.shields.io/github/followers/ueman?style=social)](https://github.com/ueman) 91 | [![Twitter Follow](https://img.shields.io/twitter/follow/ue_man?style=social)](https://twitter.com/ue_man) 92 | 93 | ## Contributors 94 | 95 | <a href="https://github.com/ueman/screenrecorder/graphs/contributors"> 96 | <img src="https://contrib.rocks/image?repo=ueman/screenrecorder" /> 97 | </a> 98 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | analyzer: 3 | errors: 4 | missing_required_param: error 5 | missing_return: error 6 | todo: ignore 7 | 8 | linter: 9 | rules: 10 | one_member_abstracts: false 11 | prefer_relative_imports: true 12 | always_use_package_imports: false 13 | omit_local_variable_types: false 14 | directives_ordering: true 15 | eol_at_end_of_file: true 16 | -------------------------------------------------------------------------------- /example/.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 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /example/.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 and should not be manually edited. 5 | 6 | version: 7 | revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" 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: 761747bfc538b5af34aa0d3fac380f1bc331ec49 17 | base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 18 | - platform: android 19 | create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 20 | base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 21 | 22 | # User provided section 23 | 24 | # List of Local paths (relative to this file) that should be 25 | # ignored by the migrate tool. 26 | # 27 | # Files that are not part of the templates will be ignored by default. 28 | unmanaged_files: 29 | - 'lib/main.dart' 30 | - 'ios/Runner.xcodeproj/project.pbxproj' 31 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # example 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 | -------------------------------------------------------------------------------- /example/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | analyzer: 3 | errors: 4 | missing_required_param: error 5 | missing_return: error 6 | todo: ignore 7 | 8 | linter: 9 | rules: 10 | one_member_abstracts: false 11 | prefer_relative_imports: true 12 | always_use_package_imports: false 13 | omit_local_variable_types: false 14 | directives_ordering: true 15 | eol_at_end_of_file: true 16 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. 5 | id "dev.flutter.flutter-gradle-plugin" 6 | } 7 | 8 | def localProperties = new Properties() 9 | def localPropertiesFile = rootProject.file("local.properties") 10 | if (localPropertiesFile.exists()) { 11 | localPropertiesFile.withReader("UTF-8") { reader -> 12 | localProperties.load(reader) 13 | } 14 | } 15 | 16 | def flutterVersionCode = localProperties.getProperty("flutter.versionCode") 17 | if (flutterVersionCode == null) { 18 | flutterVersionCode = "1" 19 | } 20 | 21 | def flutterVersionName = localProperties.getProperty("flutter.versionName") 22 | if (flutterVersionName == null) { 23 | flutterVersionName = "1.0" 24 | } 25 | 26 | android { 27 | namespace = "com.example.example" 28 | compileSdk = flutter.compileSdkVersion 29 | ndkVersion = flutter.ndkVersion 30 | 31 | compileOptions { 32 | sourceCompatibility = JavaVersion.VERSION_1_8 33 | targetCompatibility = JavaVersion.VERSION_1_8 34 | } 35 | 36 | defaultConfig { 37 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 38 | applicationId = "com.example.example" 39 | // You can update the following values to match your application needs. 40 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 41 | minSdk = flutter.minSdkVersion 42 | targetSdk = flutter.targetSdkVersion 43 | versionCode = flutterVersionCode.toInteger() 44 | versionName = flutterVersionName 45 | } 46 | 47 | buildTypes { 48 | release { 49 | // TODO: Add your own signing config for the release build. 50 | // Signing with the debug keys for now, so `flutter run --release` works. 51 | signingConfig = signingConfigs.debug 52 | } 53 | } 54 | } 55 | 56 | flutter { 57 | source = "../.." 58 | } 59 | -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 | <!-- The INTERNET permission is required for development. Specifically, 3 | the Flutter tool needs it to communicate with the running application 4 | to allow setting breakpoints, to provide hot reload, etc. 5 | --> 6 | <uses-permission android:name="android.permission.INTERNET"/> 7 | </manifest> 8 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 | <application 3 | android:label="example" 4 | android:name="${applicationName}" 5 | android:icon="@mipmap/ic_launcher"> 6 | <activity 7 | android:name=".MainActivity" 8 | android:exported="true" 9 | android:launchMode="singleTop" 10 | android:taskAffinity="" 11 | android:theme="@style/LaunchTheme" 12 | android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" 13 | android:hardwareAccelerated="true" 14 | android:windowSoftInputMode="adjustResize"> 15 | <!-- Specifies an Android theme to apply to this Activity as soon as 16 | the Android process has started. This theme is visible to the user 17 | while the Flutter UI initializes. After that, this theme continues 18 | to determine the Window background behind the Flutter UI. --> 19 | <meta-data 20 | android:name="io.flutter.embedding.android.NormalTheme" 21 | android:resource="@style/NormalTheme" 22 | /> 23 | <intent-filter> 24 | <action android:name="android.intent.action.MAIN"/> 25 | <category android:name="android.intent.category.LAUNCHER"/> 26 | </intent-filter> 27 | </activity> 28 | <!-- Don't delete the meta-data below. 29 | This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> 30 | <meta-data 31 | android:name="flutterEmbedding" 32 | android:value="2" /> 33 | </application> 34 | <!-- Required to query activities that can process text, see: 35 | https://developer.android.com/training/package-visibility and 36 | https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. 37 | 38 | In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> 39 | <queries> 40 | <intent> 41 | <action android:name="android.intent.action.PROCESS_TEXT"/> 42 | <data android:mimeType="text/plain"/> 43 | </intent> 44 | </queries> 45 | </manifest> 46 | -------------------------------------------------------------------------------- /example/android/app/src/main/kotlin/com/example/example/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.example 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() 6 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Modify this file to customize your launch splash screen --> 3 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 4 | <item android:drawable="?android:colorBackground" /> 5 | 6 | <!-- You can insert your own image assets here --> 7 | <!-- <item> 8 | <bitmap 9 | android:gravity="center" 10 | android:src="@mipmap/launch_image" /> 11 | </item> --> 12 | </layer-list> 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Modify this file to customize your launch splash screen --> 3 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 4 | <item android:drawable="@android:color/white" /> 5 | 6 | <!-- You can insert your own image assets here --> 7 | <!-- <item> 8 | <bitmap 9 | android:gravity="center" 10 | android:src="@mipmap/launch_image" /> 11 | </item> --> 12 | </layer-list> 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | the Flutter engine draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <resources> 3 | <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> 4 | <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> 5 | <!-- Show a splash screen on the activity. Automatically removed when 6 | the Flutter engine draws its first frame --> 7 | <item name="android:windowBackground">@drawable/launch_background</item> 8 | </style> 9 | <!-- Theme applied to the Android Window as soon as the process has started. 10 | This theme determines the color of the Android Window while your 11 | Flutter UI initializes, as well as behind your Flutter UI while its 12 | running. 13 | 14 | This Theme is only used starting with V2 of Flutter's Android embedding. --> 15 | <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> 16 | <item name="android:windowBackground">?android:colorBackground</item> 17 | </style> 18 | </resources> 19 | -------------------------------------------------------------------------------- /example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 2 | <!-- The INTERNET permission is required for development. Specifically, 3 | the Flutter tool needs it to communicate with the running application 4 | to allow setting breakpoints, to provide hot reload, etc. 5 | --> 6 | <uses-permission android:name="android.permission.INTERNET"/> 7 | </manifest> 8 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = "../build" 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(":app") 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /example/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.6.3-all.zip 6 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | }() 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 21 | id "com.android.application" version "7.3.0" apply false 22 | id "org.jetbrains.kotlin.android" version "1.7.10" apply false 23 | } 24 | 25 | include ":app" 26 | -------------------------------------------------------------------------------- /example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /example/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CFBundleDevelopmentRegion</key> 6 | <string>en</string> 7 | <key>CFBundleExecutable</key> 8 | <string>App</string> 9 | <key>CFBundleIdentifier</key> 10 | <string>io.flutter.flutter.app</string> 11 | <key>CFBundleInfoDictionaryVersion</key> 12 | <string>6.0</string> 13 | <key>CFBundleName</key> 14 | <string>App</string> 15 | <key>CFBundlePackageType</key> 16 | <string>FMWK</string> 17 | <key>CFBundleShortVersionString</key> 18 | <string>1.0</string> 19 | <key>CFBundleSignature</key> 20 | <string>????</string> 21 | <key>CFBundleVersion</key> 22 | <string>1.0</string> 23 | <key>MinimumOSVersion</key> 24 | <string>8.0</string> 25 | </dict> 26 | </plist> 27 | -------------------------------------------------------------------------------- /example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = "<group>"; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = "<group>"; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = "<group>"; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = "<group>"; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = "<group>"; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = "<group>"; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 294 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 297 | SWIFT_VERSION = 5.0; 298 | VERSIONING_SYSTEM = "apple-generic"; 299 | }; 300 | name = Profile; 301 | }; 302 | 97C147031CF9000F007C117D /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = dwarf; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_DYNAMIC_NO_PIC = NO; 337 | GCC_NO_COMMON_BLOCKS = YES; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 350 | MTL_ENABLE_DEBUG_INFO = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | TARGETED_DEVICE_FAMILY = "1,2"; 354 | }; 355 | name = Debug; 356 | }; 357 | 97C147041CF9000F007C117D /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu99; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 394 | GCC_WARN_UNDECLARED_SELECTOR = YES; 395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 396 | GCC_WARN_UNUSED_FUNCTION = YES; 397 | GCC_WARN_UNUSED_VARIABLE = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 399 | MTL_ENABLE_DEBUG_INFO = NO; 400 | SDKROOT = iphoneos; 401 | SUPPORTED_PLATFORMS = iphoneos; 402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Release; 407 | }; 408 | 97C147061CF9000F007C117D /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CLANG_ENABLE_MODULES = YES; 414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 415 | ENABLE_BITCODE = NO; 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 419 | PRODUCT_NAME = "$(TARGET_NAME)"; 420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | SWIFT_VERSION = 5.0; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | }; 425 | name = Debug; 426 | }; 427 | 97C147071CF9000F007C117D /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | INFOPLIST_FILE = Runner/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 440 | SWIFT_VERSION = 5.0; 441 | VERSIONING_SYSTEM = "apple-generic"; 442 | }; 443 | name = Release; 444 | }; 445 | /* End XCBuildConfiguration section */ 446 | 447 | /* Begin XCConfigurationList section */ 448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | 97C147031CF9000F007C117D /* Debug */, 452 | 97C147041CF9000F007C117D /* Release */, 453 | 249021D3217E4FDB00AE95B9 /* Profile */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147061CF9000F007C117D /* Debug */, 462 | 97C147071CF9000F007C117D /* Release */, 463 | 249021D4217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | /* End XCConfigurationList section */ 469 | }; 470 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 471 | } 472 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Workspace 3 | version = "1.0"> 4 | <FileRef 5 | location = "self:"> 6 | </FileRef> 7 | </Workspace> 8 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>PreviewsEnabled</key> 6 | <false/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Scheme 3 | LastUpgradeVersion = "1020" 4 | version = "1.3"> 5 | <BuildAction 6 | parallelizeBuildables = "YES" 7 | buildImplicitDependencies = "YES"> 8 | <BuildActionEntries> 9 | <BuildActionEntry 10 | buildForTesting = "YES" 11 | buildForRunning = "YES" 12 | buildForProfiling = "YES" 13 | buildForArchiving = "YES" 14 | buildForAnalyzing = "YES"> 15 | <BuildableReference 16 | BuildableIdentifier = "primary" 17 | BlueprintIdentifier = "97C146ED1CF9000F007C117D" 18 | BuildableName = "Runner.app" 19 | BlueprintName = "Runner" 20 | ReferencedContainer = "container:Runner.xcodeproj"> 21 | </BuildableReference> 22 | </BuildActionEntry> 23 | </BuildActionEntries> 24 | </BuildAction> 25 | <TestAction 26 | buildConfiguration = "Debug" 27 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 28 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 29 | shouldUseLaunchSchemeArgsEnv = "YES"> 30 | <Testables> 31 | </Testables> 32 | <MacroExpansion> 33 | <BuildableReference 34 | BuildableIdentifier = "primary" 35 | BlueprintIdentifier = "97C146ED1CF9000F007C117D" 36 | BuildableName = "Runner.app" 37 | BlueprintName = "Runner" 38 | ReferencedContainer = "container:Runner.xcodeproj"> 39 | </BuildableReference> 40 | </MacroExpansion> 41 | <AdditionalOptions> 42 | </AdditionalOptions> 43 | </TestAction> 44 | <LaunchAction 45 | buildConfiguration = "Debug" 46 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 47 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 48 | launchStyle = "0" 49 | useCustomWorkingDirectory = "NO" 50 | ignoresPersistentStateOnLaunch = "NO" 51 | debugDocumentVersioning = "YES" 52 | debugServiceExtension = "internal" 53 | allowLocationSimulation = "YES"> 54 | <BuildableProductRunnable 55 | runnableDebuggingMode = "0"> 56 | <BuildableReference 57 | BuildableIdentifier = "primary" 58 | BlueprintIdentifier = "97C146ED1CF9000F007C117D" 59 | BuildableName = "Runner.app" 60 | BlueprintName = "Runner" 61 | ReferencedContainer = "container:Runner.xcodeproj"> 62 | </BuildableReference> 63 | </BuildableProductRunnable> 64 | <AdditionalOptions> 65 | </AdditionalOptions> 66 | </LaunchAction> 67 | <ProfileAction 68 | buildConfiguration = "Profile" 69 | shouldUseLaunchSchemeArgsEnv = "YES" 70 | savedToolIdentifier = "" 71 | useCustomWorkingDirectory = "NO" 72 | debugDocumentVersioning = "YES"> 73 | <BuildableProductRunnable 74 | runnableDebuggingMode = "0"> 75 | <BuildableReference 76 | BuildableIdentifier = "primary" 77 | BlueprintIdentifier = "97C146ED1CF9000F007C117D" 78 | BuildableName = "Runner.app" 79 | BlueprintName = "Runner" 80 | ReferencedContainer = "container:Runner.xcodeproj"> 81 | </BuildableReference> 82 | </BuildableProductRunnable> 83 | </ProfileAction> 84 | <AnalyzeAction 85 | buildConfiguration = "Debug"> 86 | </AnalyzeAction> 87 | <ArchiveAction 88 | buildConfiguration = "Release" 89 | revealArchiveInOrganizer = "YES"> 90 | </ArchiveAction> 91 | </Scheme> 92 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Workspace 3 | version = "1.0"> 4 | <FileRef 5 | location = "group:Runner.xcodeproj"> 6 | </FileRef> 7 | </Workspace> 8 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>PreviewsEnabled</key> 6 | <false/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /example/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. -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> 3 | <dependencies> 4 | <deployment identifier="iOS"/> 5 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> 6 | </dependencies> 7 | <scenes> 8 | <!--View Controller--> 9 | <scene sceneID="EHf-IW-A2E"> 10 | <objects> 11 | <viewController id="01J-lp-oVM" sceneMemberID="viewController"> 12 | <layoutGuides> 13 | <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> 14 | <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> 15 | </layoutGuides> 16 | <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> 17 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 18 | <subviews> 19 | <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> 20 | </imageView> 21 | </subviews> 22 | <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 23 | <constraints> 24 | <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> 25 | <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> 26 | </constraints> 27 | </view> 28 | </viewController> 29 | <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> 30 | </objects> 31 | <point key="canvasLocation" x="53" y="375"/> 32 | </scene> 33 | </scenes> 34 | <resources> 35 | <image name="LaunchImage" width="168" height="185"/> 36 | </resources> 37 | </document> 38 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 | <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> 3 | <dependencies> 4 | <deployment identifier="iOS"/> 5 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> 6 | </dependencies> 7 | <scenes> 8 | <!--Flutter View Controller--> 9 | <scene sceneID="tne-QT-ifu"> 10 | <objects> 11 | <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> 12 | <layoutGuides> 13 | <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> 14 | <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> 15 | </layoutGuides> 16 | <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> 17 | <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 18 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 19 | <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 20 | </view> 21 | </viewController> 22 | <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> 23 | </objects> 24 | </scene> 25 | </scenes> 26 | </document> 27 | -------------------------------------------------------------------------------- /example/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CFBundleDevelopmentRegion</key> 6 | <string>$(DEVELOPMENT_LANGUAGE)</string> 7 | <key>CFBundleExecutable</key> 8 | <string>$(EXECUTABLE_NAME)</string> 9 | <key>CFBundleIdentifier</key> 10 | <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 11 | <key>CFBundleInfoDictionaryVersion</key> 12 | <string>6.0</string> 13 | <key>CFBundleName</key> 14 | <string>example</string> 15 | <key>CFBundlePackageType</key> 16 | <string>APPL</string> 17 | <key>CFBundleShortVersionString</key> 18 | <string>$(FLUTTER_BUILD_NAME)</string> 19 | <key>CFBundleSignature</key> 20 | <string>????</string> 21 | <key>CFBundleVersion</key> 22 | <string>$(FLUTTER_BUILD_NUMBER)</string> 23 | <key>LSRequiresIPhoneOS</key> 24 | <true/> 25 | <key>UILaunchStoryboardName</key> 26 | <string>LaunchScreen</string> 27 | <key>UIMainStoryboardFile</key> 28 | <string>Main</string> 29 | <key>UISupportedInterfaceOrientations</key> 30 | <array> 31 | <string>UIInterfaceOrientationPortrait</string> 32 | <string>UIInterfaceOrientationLandscapeLeft</string> 33 | <string>UIInterfaceOrientationLandscapeRight</string> 34 | </array> 35 | <key>UISupportedInterfaceOrientations~ipad</key> 36 | <array> 37 | <string>UIInterfaceOrientationPortrait</string> 38 | <string>UIInterfaceOrientationPortraitUpsideDown</string> 39 | <string>UIInterfaceOrientationLandscapeLeft</string> 40 | <string>UIInterfaceOrientationLandscapeRight</string> 41 | </array> 42 | <key>UIViewControllerBasedStatusBarAppearance</key> 43 | <false/> 44 | </dict> 45 | </plist> 46 | -------------------------------------------------------------------------------- /example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:typed_data'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:screen_recorder/screen_recorder.dart'; 5 | 6 | import 'sample_animation.dart'; 7 | 8 | void main() { 9 | runApp(const MyApp()); 10 | } 11 | 12 | class MyApp extends StatelessWidget { 13 | const MyApp({super.key}); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return MaterialApp( 18 | title: 'Flutter Demo', 19 | theme: ThemeData( 20 | primarySwatch: Colors.blue, 21 | ), 22 | home: const MyHomePage(title: 'Flutter Demo Home Page'), 23 | ); 24 | } 25 | } 26 | 27 | class MyHomePage extends StatefulWidget { 28 | const MyHomePage({super.key, required this.title}); 29 | 30 | final String title; 31 | 32 | @override 33 | State<MyHomePage> createState() => _MyHomePageState(); 34 | } 35 | 36 | class _MyHomePageState extends State<MyHomePage> { 37 | bool _recording = false; 38 | bool _exporting = false; 39 | ScreenRecorderController controller = ScreenRecorderController(); 40 | bool get canExport => controller.exporter.hasFrames; 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | return Scaffold( 45 | appBar: AppBar( 46 | title: Text(widget.title), 47 | ), 48 | body: Center( 49 | child: SingleChildScrollView( 50 | child: Column( 51 | mainAxisAlignment: MainAxisAlignment.center, 52 | children: <Widget>[ 53 | if (_exporting) 54 | const Center(child: CircularProgressIndicator()) 55 | else ...[ 56 | ScreenRecorder( 57 | height: 500, 58 | width: 500, 59 | controller: controller, 60 | child: const SampleAnimation(), 61 | ), 62 | if (!_recording && !_exporting) 63 | Padding( 64 | padding: const EdgeInsets.all(8.0), 65 | child: ElevatedButton( 66 | onPressed: () { 67 | controller.start(); 68 | setState(() { 69 | _recording = true; 70 | }); 71 | }, 72 | child: const Text('Start'), 73 | ), 74 | ), 75 | if (_recording && !_exporting) 76 | Padding( 77 | padding: const EdgeInsets.all(8.0), 78 | child: ElevatedButton( 79 | onPressed: () { 80 | controller.stop(); 81 | setState(() { 82 | _recording = false; 83 | }); 84 | }, 85 | child: const Text('Stop'), 86 | ), 87 | ), 88 | if (canExport && !_exporting) 89 | Padding( 90 | padding: const EdgeInsets.all(8.0), 91 | child: ElevatedButton( 92 | onPressed: () async { 93 | setState(() { 94 | _exporting = true; 95 | }); 96 | var frames = await controller.exporter.exportFrames(); 97 | if (frames == null) { 98 | throw Exception(); 99 | } 100 | setState(() => _exporting = false); 101 | showDialog( 102 | context: context as dynamic, 103 | builder: (context) { 104 | return AlertDialog( 105 | content: SizedBox( 106 | height: 500, 107 | width: 500, 108 | child: ListView.builder( 109 | padding: const EdgeInsets.all(8.0), 110 | itemCount: frames.length, 111 | itemBuilder: 112 | (BuildContext context, int index) { 113 | final image = frames[index].image; 114 | return SizedBox( 115 | height: 150, 116 | child: Image.memory( 117 | image.buffer.asUint8List(), 118 | ), 119 | ); 120 | }, 121 | ), 122 | ), 123 | ); 124 | }, 125 | ); 126 | }, 127 | child: const Text('Export as frames'), 128 | ), 129 | ), 130 | if (canExport && !_exporting) ...[ 131 | Padding( 132 | padding: const EdgeInsets.all(8.0), 133 | child: ElevatedButton( 134 | onPressed: () async { 135 | setState(() { 136 | _exporting = true; 137 | }); 138 | var gif = await controller.exporter.exportGif(); 139 | if (gif == null) { 140 | throw Exception(); 141 | } 142 | setState(() => _exporting = false); 143 | showDialog( 144 | context: context as dynamic, 145 | builder: (context) { 146 | return AlertDialog( 147 | content: Image.memory(Uint8List.fromList(gif)), 148 | ); 149 | }, 150 | ); 151 | }, 152 | child: const Text('Export as GIF'), 153 | ), 154 | ), 155 | Padding( 156 | padding: const EdgeInsets.all(8.0), 157 | child: ElevatedButton( 158 | onPressed: () { 159 | setState(() { 160 | controller.exporter.clear(); 161 | }); 162 | }, 163 | child: const Text('Clear recorded data'), 164 | ), 165 | ) 166 | ] 167 | ] 168 | ], 169 | ), 170 | ), 171 | ), 172 | ); 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /example/lib/sample_animation.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:math'; 3 | 4 | import 'package:flutter/material.dart'; 5 | 6 | class SampleAnimation extends StatefulWidget { 7 | const SampleAnimation({super.key}); 8 | 9 | @override 10 | State<SampleAnimation> createState() => _SampleAnimationState(); 11 | } 12 | 13 | class _SampleAnimationState extends State<SampleAnimation> { 14 | double paddingTop = 5; 15 | double paddingleft = 5; 16 | Color _color = Colors.green; 17 | BorderRadiusGeometry _borderRadius = BorderRadius.circular(8); 18 | 19 | @override 20 | void initState() { 21 | super.initState(); 22 | startTimer(); 23 | } 24 | 25 | @override 26 | void dispose() { 27 | _timer?.cancel(); 28 | super.dispose(); 29 | } 30 | 31 | Timer? _timer; 32 | 33 | void startTimer() { 34 | const oneSec = Duration(seconds: 1); 35 | _timer = Timer.periodic( 36 | oneSec, 37 | (Timer timer) { 38 | setState(() { 39 | final random = Random(); 40 | 41 | paddingTop = random.nextInt(150).toDouble(); 42 | paddingTop = random.nextInt(150).toDouble(); 43 | 44 | _color = Color.fromRGBO( 45 | random.nextInt(256), 46 | random.nextInt(256), 47 | random.nextInt(256), 48 | 1, 49 | ); 50 | 51 | _borderRadius = BorderRadius.circular(random.nextInt(100).toDouble()); 52 | }); 53 | }, 54 | ); 55 | } 56 | 57 | @override 58 | Widget build(BuildContext context) { 59 | return AnimatedContainer( 60 | margin: 61 | EdgeInsets.symmetric(horizontal: paddingleft, vertical: paddingTop), 62 | decoration: BoxDecoration( 63 | color: _color, 64 | borderRadius: _borderRadius, 65 | ), 66 | duration: const Duration(seconds: 1), 67 | curve: Curves.fastOutSlowIn, 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /example/macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/xcuserdata/ 7 | -------------------------------------------------------------------------------- /example/macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | 9 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 10 | } 11 | -------------------------------------------------------------------------------- /example/macos/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 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 = "<group>"; }; 56 | 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; }; 57 | 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 59 | 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; }; 60 | 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; }; 61 | 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; }; 62 | 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; }; 63 | 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; }; 64 | 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; }; 65 | 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; }; 66 | 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; }; 67 | 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; }; 68 | 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; }; 69 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; }; 70 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; }; 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 = "<group>"; 94 | }; 95 | 33CC10E42044A3C60003C045 = { 96 | isa = PBXGroup; 97 | children = ( 98 | 33FAB671232836740065AC1E /* Runner */, 99 | 33CEB47122A05771004F2AC0 /* Flutter */, 100 | 33CC10EE2044A3C60003C045 /* Products */, 101 | D73912EC22F37F3D000D13A0 /* Frameworks */, 102 | ); 103 | sourceTree = "<group>"; 104 | }; 105 | 33CC10EE2044A3C60003C045 /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 33CC10ED2044A3C60003C045 /* example.app */, 109 | ); 110 | name = Products; 111 | sourceTree = "<group>"; 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 = "<group>"; 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 = "<group>"; 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 = "<group>"; 147 | }; 148 | D73912EC22F37F3D000D13A0 /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | ); 152 | name = Frameworks; 153 | sourceTree = "<group>"; 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 /* example.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 | alwaysOutOfDate = 1; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | ); 242 | inputFileListPaths = ( 243 | ); 244 | inputPaths = ( 245 | ); 246 | outputFileListPaths = ( 247 | ); 248 | outputPaths = ( 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | shellPath = /bin/sh; 252 | shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; 253 | }; 254 | 33CC111E2044C6BF0003C045 /* ShellScript */ = { 255 | isa = PBXShellScriptBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | inputFileListPaths = ( 260 | Flutter/ephemeral/FlutterInputs.xcfilelist, 261 | ); 262 | inputPaths = ( 263 | Flutter/ephemeral/tripwire, 264 | ); 265 | outputFileListPaths = ( 266 | Flutter/ephemeral/FlutterOutputs.xcfilelist, 267 | ); 268 | outputPaths = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | shellPath = /bin/sh; 272 | shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; 273 | }; 274 | /* End PBXShellScriptBuildPhase section */ 275 | 276 | /* Begin PBXSourcesBuildPhase section */ 277 | 33CC10E92044A3C60003C045 /* Sources */ = { 278 | isa = PBXSourcesBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 282 | 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 283 | 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXSourcesBuildPhase section */ 288 | 289 | /* Begin PBXTargetDependency section */ 290 | 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { 291 | isa = PBXTargetDependency; 292 | target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; 293 | targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; 294 | }; 295 | /* End PBXTargetDependency section */ 296 | 297 | /* Begin PBXVariantGroup section */ 298 | 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { 299 | isa = PBXVariantGroup; 300 | children = ( 301 | 33CC10F52044A3C60003C045 /* Base */, 302 | ); 303 | name = MainMenu.xib; 304 | path = Runner; 305 | sourceTree = "<group>"; 306 | }; 307 | /* End PBXVariantGroup section */ 308 | 309 | /* Begin XCBuildConfiguration section */ 310 | 338D0CE9231458BD00FA5F75 /* Profile */ = { 311 | isa = XCBuildConfiguration; 312 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 313 | buildSettings = { 314 | ALWAYS_SEARCH_USER_PATHS = NO; 315 | CLANG_ANALYZER_NONNULL = YES; 316 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 317 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 318 | CLANG_CXX_LIBRARY = "libc++"; 319 | CLANG_ENABLE_MODULES = YES; 320 | CLANG_ENABLE_OBJC_ARC = YES; 321 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 322 | CLANG_WARN_BOOL_CONVERSION = YES; 323 | CLANG_WARN_CONSTANT_CONVERSION = YES; 324 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 325 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 326 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 327 | CLANG_WARN_EMPTY_BODY = YES; 328 | CLANG_WARN_ENUM_CONVERSION = YES; 329 | CLANG_WARN_INFINITE_RECURSION = YES; 330 | CLANG_WARN_INT_CONVERSION = YES; 331 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 334 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CODE_SIGN_IDENTITY = "-"; 337 | COPY_PHASE_STRIP = NO; 338 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 339 | ENABLE_NS_ASSERTIONS = NO; 340 | ENABLE_STRICT_OBJC_MSGSEND = YES; 341 | GCC_C_LANGUAGE_STANDARD = gnu11; 342 | GCC_NO_COMMON_BLOCKS = YES; 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 346 | GCC_WARN_UNUSED_FUNCTION = YES; 347 | GCC_WARN_UNUSED_VARIABLE = YES; 348 | MACOSX_DEPLOYMENT_TARGET = 10.13; 349 | MTL_ENABLE_DEBUG_INFO = NO; 350 | SDKROOT = macosx; 351 | SWIFT_COMPILATION_MODE = wholemodule; 352 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 353 | }; 354 | name = Profile; 355 | }; 356 | 338D0CEA231458BD00FA5F75 /* Profile */ = { 357 | isa = XCBuildConfiguration; 358 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | CLANG_ENABLE_MODULES = YES; 362 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 363 | CODE_SIGN_STYLE = Automatic; 364 | COMBINE_HIDPI_IMAGES = YES; 365 | INFOPLIST_FILE = Runner/Info.plist; 366 | LD_RUNPATH_SEARCH_PATHS = ( 367 | "$(inherited)", 368 | "@executable_path/../Frameworks", 369 | ); 370 | PROVISIONING_PROFILE_SPECIFIER = ""; 371 | SWIFT_VERSION = 5.0; 372 | }; 373 | name = Profile; 374 | }; 375 | 338D0CEB231458BD00FA5F75 /* Profile */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | CODE_SIGN_STYLE = Manual; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | }; 381 | name = Profile; 382 | }; 383 | 33CC10F92044A3C60003C045 /* Debug */ = { 384 | isa = XCBuildConfiguration; 385 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 386 | buildSettings = { 387 | ALWAYS_SEARCH_USER_PATHS = NO; 388 | CLANG_ANALYZER_NONNULL = YES; 389 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 395 | CLANG_WARN_BOOL_CONVERSION = YES; 396 | CLANG_WARN_CONSTANT_CONVERSION = YES; 397 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 398 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 399 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 400 | CLANG_WARN_EMPTY_BODY = YES; 401 | CLANG_WARN_ENUM_CONVERSION = YES; 402 | CLANG_WARN_INFINITE_RECURSION = YES; 403 | CLANG_WARN_INT_CONVERSION = YES; 404 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 407 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 408 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 409 | CODE_SIGN_IDENTITY = "-"; 410 | COPY_PHASE_STRIP = NO; 411 | DEBUG_INFORMATION_FORMAT = dwarf; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | ENABLE_TESTABILITY = YES; 414 | GCC_C_LANGUAGE_STANDARD = gnu11; 415 | GCC_DYNAMIC_NO_PIC = NO; 416 | GCC_NO_COMMON_BLOCKS = YES; 417 | GCC_OPTIMIZATION_LEVEL = 0; 418 | GCC_PREPROCESSOR_DEFINITIONS = ( 419 | "DEBUG=1", 420 | "$(inherited)", 421 | ); 422 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 423 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 424 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 425 | GCC_WARN_UNUSED_FUNCTION = YES; 426 | GCC_WARN_UNUSED_VARIABLE = YES; 427 | MACOSX_DEPLOYMENT_TARGET = 10.13; 428 | MTL_ENABLE_DEBUG_INFO = YES; 429 | ONLY_ACTIVE_ARCH = YES; 430 | SDKROOT = macosx; 431 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 432 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 433 | }; 434 | name = Debug; 435 | }; 436 | 33CC10FA2044A3C60003C045 /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 439 | buildSettings = { 440 | ALWAYS_SEARCH_USER_PATHS = NO; 441 | CLANG_ANALYZER_NONNULL = YES; 442 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 443 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 444 | CLANG_CXX_LIBRARY = "libc++"; 445 | CLANG_ENABLE_MODULES = YES; 446 | CLANG_ENABLE_OBJC_ARC = YES; 447 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 448 | CLANG_WARN_BOOL_CONVERSION = YES; 449 | CLANG_WARN_CONSTANT_CONVERSION = YES; 450 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 451 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 452 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 453 | CLANG_WARN_EMPTY_BODY = YES; 454 | CLANG_WARN_ENUM_CONVERSION = YES; 455 | CLANG_WARN_INFINITE_RECURSION = YES; 456 | CLANG_WARN_INT_CONVERSION = YES; 457 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 459 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 460 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 461 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 462 | CODE_SIGN_IDENTITY = "-"; 463 | COPY_PHASE_STRIP = NO; 464 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 465 | ENABLE_NS_ASSERTIONS = NO; 466 | ENABLE_STRICT_OBJC_MSGSEND = YES; 467 | GCC_C_LANGUAGE_STANDARD = gnu11; 468 | GCC_NO_COMMON_BLOCKS = YES; 469 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 470 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | MACOSX_DEPLOYMENT_TARGET = 10.13; 475 | MTL_ENABLE_DEBUG_INFO = NO; 476 | SDKROOT = macosx; 477 | SWIFT_COMPILATION_MODE = wholemodule; 478 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 479 | }; 480 | name = Release; 481 | }; 482 | 33CC10FC2044A3C60003C045 /* Debug */ = { 483 | isa = XCBuildConfiguration; 484 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 485 | buildSettings = { 486 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 487 | CLANG_ENABLE_MODULES = YES; 488 | CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; 489 | CODE_SIGN_STYLE = Automatic; 490 | COMBINE_HIDPI_IMAGES = YES; 491 | INFOPLIST_FILE = Runner/Info.plist; 492 | LD_RUNPATH_SEARCH_PATHS = ( 493 | "$(inherited)", 494 | "@executable_path/../Frameworks", 495 | ); 496 | PROVISIONING_PROFILE_SPECIFIER = ""; 497 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 498 | SWIFT_VERSION = 5.0; 499 | }; 500 | name = Debug; 501 | }; 502 | 33CC10FD2044A3C60003C045 /* Release */ = { 503 | isa = XCBuildConfiguration; 504 | baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; 505 | buildSettings = { 506 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 507 | CLANG_ENABLE_MODULES = YES; 508 | CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; 509 | CODE_SIGN_STYLE = Automatic; 510 | COMBINE_HIDPI_IMAGES = YES; 511 | INFOPLIST_FILE = Runner/Info.plist; 512 | LD_RUNPATH_SEARCH_PATHS = ( 513 | "$(inherited)", 514 | "@executable_path/../Frameworks", 515 | ); 516 | PROVISIONING_PROFILE_SPECIFIER = ""; 517 | SWIFT_VERSION = 5.0; 518 | }; 519 | name = Release; 520 | }; 521 | 33CC111C2044C6BA0003C045 /* Debug */ = { 522 | isa = XCBuildConfiguration; 523 | buildSettings = { 524 | CODE_SIGN_STYLE = Manual; 525 | PRODUCT_NAME = "$(TARGET_NAME)"; 526 | }; 527 | name = Debug; 528 | }; 529 | 33CC111D2044C6BA0003C045 /* Release */ = { 530 | isa = XCBuildConfiguration; 531 | buildSettings = { 532 | CODE_SIGN_STYLE = Automatic; 533 | PRODUCT_NAME = "$(TARGET_NAME)"; 534 | }; 535 | name = Release; 536 | }; 537 | /* End XCBuildConfiguration section */ 538 | 539 | /* Begin XCConfigurationList section */ 540 | 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { 541 | isa = XCConfigurationList; 542 | buildConfigurations = ( 543 | 33CC10F92044A3C60003C045 /* Debug */, 544 | 33CC10FA2044A3C60003C045 /* Release */, 545 | 338D0CE9231458BD00FA5F75 /* Profile */, 546 | ); 547 | defaultConfigurationIsVisible = 0; 548 | defaultConfigurationName = Release; 549 | }; 550 | 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 33CC10FC2044A3C60003C045 /* Debug */, 554 | 33CC10FD2044A3C60003C045 /* Release */, 555 | 338D0CEA231458BD00FA5F75 /* Profile */, 556 | ); 557 | defaultConfigurationIsVisible = 0; 558 | defaultConfigurationName = Release; 559 | }; 560 | 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { 561 | isa = XCConfigurationList; 562 | buildConfigurations = ( 563 | 33CC111C2044C6BA0003C045 /* Debug */, 564 | 33CC111D2044C6BA0003C045 /* Release */, 565 | 338D0CEB231458BD00FA5F75 /* Profile */, 566 | ); 567 | defaultConfigurationIsVisible = 0; 568 | defaultConfigurationName = Release; 569 | }; 570 | /* End XCConfigurationList section */ 571 | }; 572 | rootObject = 33CC10E52044A3C60003C045 /* Project object */; 573 | } 574 | -------------------------------------------------------------------------------- /example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Scheme 3 | LastUpgradeVersion = "1300" 4 | version = "1.3"> 5 | <BuildAction 6 | parallelizeBuildables = "YES" 7 | buildImplicitDependencies = "YES"> 8 | <BuildActionEntries> 9 | <BuildActionEntry 10 | buildForTesting = "YES" 11 | buildForRunning = "YES" 12 | buildForProfiling = "YES" 13 | buildForArchiving = "YES" 14 | buildForAnalyzing = "YES"> 15 | <BuildableReference 16 | BuildableIdentifier = "primary" 17 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 18 | BuildableName = "example.app" 19 | BlueprintName = "Runner" 20 | ReferencedContainer = "container:Runner.xcodeproj"> 21 | </BuildableReference> 22 | </BuildActionEntry> 23 | </BuildActionEntries> 24 | </BuildAction> 25 | <TestAction 26 | buildConfiguration = "Debug" 27 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 28 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 29 | shouldUseLaunchSchemeArgsEnv = "YES"> 30 | <MacroExpansion> 31 | <BuildableReference 32 | BuildableIdentifier = "primary" 33 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 34 | BuildableName = "example.app" 35 | BlueprintName = "Runner" 36 | ReferencedContainer = "container:Runner.xcodeproj"> 37 | </BuildableReference> 38 | </MacroExpansion> 39 | <AdditionalOptions> 40 | </AdditionalOptions> 41 | </TestAction> 42 | <LaunchAction 43 | buildConfiguration = "Debug" 44 | selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" 45 | selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" 46 | launchStyle = "0" 47 | useCustomWorkingDirectory = "NO" 48 | ignoresPersistentStateOnLaunch = "NO" 49 | debugDocumentVersioning = "YES" 50 | debugServiceExtension = "internal" 51 | allowLocationSimulation = "YES"> 52 | <BuildableProductRunnable 53 | runnableDebuggingMode = "0"> 54 | <BuildableReference 55 | BuildableIdentifier = "primary" 56 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 57 | BuildableName = "example.app" 58 | BlueprintName = "Runner" 59 | ReferencedContainer = "container:Runner.xcodeproj"> 60 | </BuildableReference> 61 | </BuildableProductRunnable> 62 | <AdditionalOptions> 63 | </AdditionalOptions> 64 | </LaunchAction> 65 | <ProfileAction 66 | buildConfiguration = "Profile" 67 | shouldUseLaunchSchemeArgsEnv = "YES" 68 | savedToolIdentifier = "" 69 | useCustomWorkingDirectory = "NO" 70 | debugDocumentVersioning = "YES"> 71 | <BuildableProductRunnable 72 | runnableDebuggingMode = "0"> 73 | <BuildableReference 74 | BuildableIdentifier = "primary" 75 | BlueprintIdentifier = "33CC10EC2044A3C60003C045" 76 | BuildableName = "example.app" 77 | BlueprintName = "Runner" 78 | ReferencedContainer = "container:Runner.xcodeproj"> 79 | </BuildableReference> 80 | </BuildableProductRunnable> 81 | </ProfileAction> 82 | <AnalyzeAction 83 | buildConfiguration = "Debug"> 84 | </AnalyzeAction> 85 | <ArchiveAction 86 | buildConfiguration = "Release" 87 | revealArchiveInOrganizer = "YES"> 88 | </ArchiveAction> 89 | </Scheme> 90 | -------------------------------------------------------------------------------- /example/macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <Workspace 3 | version = "1.0"> 4 | <FileRef 5 | location = "group:Runner.xcodeproj"> 6 | </FileRef> 7 | </Workspace> 8 | -------------------------------------------------------------------------------- /example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /example/macos/Runner/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> 3 | <dependencies> 4 | <deployment identifier="macosx"/> 5 | <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/> 6 | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 7 | </dependencies> 8 | <objects> 9 | <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> 10 | <connections> 11 | <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/> 12 | </connections> 13 | </customObject> 14 | <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> 15 | <customObject id="-3" userLabel="Application" customClass="NSObject"/> 16 | <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target"> 17 | <connections> 18 | <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/> 19 | <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/> 20 | </connections> 21 | </customObject> 22 | <customObject id="YLy-65-1bz" customClass="NSFontManager"/> 23 | <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6"> 24 | <items> 25 | <menuItem title="APP_NAME" id="1Xt-HY-uBw"> 26 | <modifierMask key="keyEquivalentModifierMask"/> 27 | <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr"> 28 | <items> 29 | <menuItem title="About APP_NAME" id="5kV-Vb-QxS"> 30 | <modifierMask key="keyEquivalentModifierMask"/> 31 | <connections> 32 | <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/> 33 | </connections> 34 | </menuItem> 35 | <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/> 36 | <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/> 37 | <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/> 38 | <menuItem title="Services" id="NMo-om-nkz"> 39 | <modifierMask key="keyEquivalentModifierMask"/> 40 | <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/> 41 | </menuItem> 42 | <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/> 43 | <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN"> 44 | <connections> 45 | <action selector="hide:" target="-1" id="PnN-Uc-m68"/> 46 | </connections> 47 | </menuItem> 48 | <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO"> 49 | <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 50 | <connections> 51 | <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/> 52 | </connections> 53 | </menuItem> 54 | <menuItem title="Show All" id="Kd2-mp-pUS"> 55 | <modifierMask key="keyEquivalentModifierMask"/> 56 | <connections> 57 | <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/> 58 | </connections> 59 | </menuItem> 60 | <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/> 61 | <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi"> 62 | <connections> 63 | <action selector="terminate:" target="-1" id="Te7-pn-YzF"/> 64 | </connections> 65 | </menuItem> 66 | </items> 67 | </menu> 68 | </menuItem> 69 | <menuItem title="Edit" id="5QF-Oa-p0T"> 70 | <modifierMask key="keyEquivalentModifierMask"/> 71 | <menu key="submenu" title="Edit" id="W48-6f-4Dl"> 72 | <items> 73 | <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg"> 74 | <connections> 75 | <action selector="undo:" target="-1" id="M6e-cu-g7V"/> 76 | </connections> 77 | </menuItem> 78 | <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam"> 79 | <connections> 80 | <action selector="redo:" target="-1" id="oIA-Rs-6OD"/> 81 | </connections> 82 | </menuItem> 83 | <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/> 84 | <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG"> 85 | <connections> 86 | <action selector="cut:" target="-1" id="YJe-68-I9s"/> 87 | </connections> 88 | </menuItem> 89 | <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU"> 90 | <connections> 91 | <action selector="copy:" target="-1" id="G1f-GL-Joy"/> 92 | </connections> 93 | </menuItem> 94 | <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL"> 95 | <connections> 96 | <action selector="paste:" target="-1" id="UvS-8e-Qdg"/> 97 | </connections> 98 | </menuItem> 99 | <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk"> 100 | <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 101 | <connections> 102 | <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/> 103 | </connections> 104 | </menuItem> 105 | <menuItem title="Delete" id="pa3-QI-u2k"> 106 | <modifierMask key="keyEquivalentModifierMask"/> 107 | <connections> 108 | <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/> 109 | </connections> 110 | </menuItem> 111 | <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m"> 112 | <connections> 113 | <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/> 114 | </connections> 115 | </menuItem> 116 | <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/> 117 | <menuItem title="Find" id="4EN-yA-p0u"> 118 | <modifierMask key="keyEquivalentModifierMask"/> 119 | <menu key="submenu" title="Find" id="1b7-l0-nxx"> 120 | <items> 121 | <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W"> 122 | <connections> 123 | <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/> 124 | </connections> 125 | </menuItem> 126 | <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz"> 127 | <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> 128 | <connections> 129 | <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/> 130 | </connections> 131 | </menuItem> 132 | <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye"> 133 | <connections> 134 | <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/> 135 | </connections> 136 | </menuItem> 137 | <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV"> 138 | <connections> 139 | <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/> 140 | </connections> 141 | </menuItem> 142 | <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt"> 143 | <connections> 144 | <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/> 145 | </connections> 146 | </menuItem> 147 | <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd"> 148 | <connections> 149 | <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/> 150 | </connections> 151 | </menuItem> 152 | </items> 153 | </menu> 154 | </menuItem> 155 | <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7"> 156 | <modifierMask key="keyEquivalentModifierMask"/> 157 | <menu key="submenu" title="Spelling" id="3IN-sU-3Bg"> 158 | <items> 159 | <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI"> 160 | <connections> 161 | <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/> 162 | </connections> 163 | </menuItem> 164 | <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7"> 165 | <connections> 166 | <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/> 167 | </connections> 168 | </menuItem> 169 | <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/> 170 | <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN"> 171 | <modifierMask key="keyEquivalentModifierMask"/> 172 | <connections> 173 | <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/> 174 | </connections> 175 | </menuItem> 176 | <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG"> 177 | <modifierMask key="keyEquivalentModifierMask"/> 178 | <connections> 179 | <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/> 180 | </connections> 181 | </menuItem> 182 | <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v"> 183 | <modifierMask key="keyEquivalentModifierMask"/> 184 | <connections> 185 | <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/> 186 | </connections> 187 | </menuItem> 188 | </items> 189 | </menu> 190 | </menuItem> 191 | <menuItem title="Substitutions" id="9ic-FL-obx"> 192 | <modifierMask key="keyEquivalentModifierMask"/> 193 | <menu key="submenu" title="Substitutions" id="FeM-D8-WVr"> 194 | <items> 195 | <menuItem title="Show Substitutions" id="z6F-FW-3nz"> 196 | <modifierMask key="keyEquivalentModifierMask"/> 197 | <connections> 198 | <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/> 199 | </connections> 200 | </menuItem> 201 | <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/> 202 | <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM"> 203 | <modifierMask key="keyEquivalentModifierMask"/> 204 | <connections> 205 | <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/> 206 | </connections> 207 | </menuItem> 208 | <menuItem title="Smart Quotes" id="hQb-2v-fYv"> 209 | <modifierMask key="keyEquivalentModifierMask"/> 210 | <connections> 211 | <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/> 212 | </connections> 213 | </menuItem> 214 | <menuItem title="Smart Dashes" id="rgM-f4-ycn"> 215 | <modifierMask key="keyEquivalentModifierMask"/> 216 | <connections> 217 | <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/> 218 | </connections> 219 | </menuItem> 220 | <menuItem title="Smart Links" id="cwL-P1-jid"> 221 | <modifierMask key="keyEquivalentModifierMask"/> 222 | <connections> 223 | <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/> 224 | </connections> 225 | </menuItem> 226 | <menuItem title="Data Detectors" id="tRr-pd-1PS"> 227 | <modifierMask key="keyEquivalentModifierMask"/> 228 | <connections> 229 | <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/> 230 | </connections> 231 | </menuItem> 232 | <menuItem title="Text Replacement" id="HFQ-gK-NFA"> 233 | <modifierMask key="keyEquivalentModifierMask"/> 234 | <connections> 235 | <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/> 236 | </connections> 237 | </menuItem> 238 | </items> 239 | </menu> 240 | </menuItem> 241 | <menuItem title="Transformations" id="2oI-Rn-ZJC"> 242 | <modifierMask key="keyEquivalentModifierMask"/> 243 | <menu key="submenu" title="Transformations" id="c8a-y6-VQd"> 244 | <items> 245 | <menuItem title="Make Upper Case" id="vmV-6d-7jI"> 246 | <modifierMask key="keyEquivalentModifierMask"/> 247 | <connections> 248 | <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/> 249 | </connections> 250 | </menuItem> 251 | <menuItem title="Make Lower Case" id="d9M-CD-aMd"> 252 | <modifierMask key="keyEquivalentModifierMask"/> 253 | <connections> 254 | <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/> 255 | </connections> 256 | </menuItem> 257 | <menuItem title="Capitalize" id="UEZ-Bs-lqG"> 258 | <modifierMask key="keyEquivalentModifierMask"/> 259 | <connections> 260 | <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/> 261 | </connections> 262 | </menuItem> 263 | </items> 264 | </menu> 265 | </menuItem> 266 | <menuItem title="Speech" id="xrE-MZ-jX0"> 267 | <modifierMask key="keyEquivalentModifierMask"/> 268 | <menu key="submenu" title="Speech" id="3rS-ZA-NoH"> 269 | <items> 270 | <menuItem title="Start Speaking" id="Ynk-f8-cLZ"> 271 | <modifierMask key="keyEquivalentModifierMask"/> 272 | <connections> 273 | <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/> 274 | </connections> 275 | </menuItem> 276 | <menuItem title="Stop Speaking" id="Oyz-dy-DGm"> 277 | <modifierMask key="keyEquivalentModifierMask"/> 278 | <connections> 279 | <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/> 280 | </connections> 281 | </menuItem> 282 | </items> 283 | </menu> 284 | </menuItem> 285 | </items> 286 | </menu> 287 | </menuItem> 288 | <menuItem title="View" id="H8h-7b-M4v"> 289 | <modifierMask key="keyEquivalentModifierMask"/> 290 | <menu key="submenu" title="View" id="HyV-fh-RgO"> 291 | <items> 292 | <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa"> 293 | <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> 294 | <connections> 295 | <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/> 296 | </connections> 297 | </menuItem> 298 | </items> 299 | </menu> 300 | </menuItem> 301 | <menuItem title="Window" id="aUF-d1-5bR"> 302 | <modifierMask key="keyEquivalentModifierMask"/> 303 | <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo"> 304 | <items> 305 | <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV"> 306 | <connections> 307 | <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/> 308 | </connections> 309 | </menuItem> 310 | <menuItem title="Zoom" id="R4o-n2-Eq4"> 311 | <modifierMask key="keyEquivalentModifierMask"/> 312 | <connections> 313 | <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/> 314 | </connections> 315 | </menuItem> 316 | <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/> 317 | <menuItem title="Bring All to Front" id="LE2-aR-0XJ"> 318 | <modifierMask key="keyEquivalentModifierMask"/> 319 | <connections> 320 | <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/> 321 | </connections> 322 | </menuItem> 323 | </items> 324 | </menu> 325 | </menuItem> 326 | </items> 327 | <point key="canvasLocation" x="142" y="-258"/> 328 | </menu> 329 | <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target"> 330 | <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> 331 | <rect key="contentRect" x="335" y="390" width="800" height="600"/> 332 | <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/> 333 | <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ"> 334 | <rect key="frame" x="0.0" y="0.0" width="800" height="600"/> 335 | <autoresizingMask key="autoresizingMask"/> 336 | </view> 337 | </window> 338 | </objects> 339 | </document> 340 | -------------------------------------------------------------------------------- /example/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 = example 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /example/macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /example/macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>com.apple.security.app-sandbox</key> 6 | <true/> 7 | <key>com.apple.security.cs.allow-jit</key> 8 | <true/> 9 | <key>com.apple.security.network.server</key> 10 | <true/> 11 | </dict> 12 | </plist> 13 | -------------------------------------------------------------------------------- /example/macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>CFBundleDevelopmentRegion</key> 6 | <string>$(DEVELOPMENT_LANGUAGE)</string> 7 | <key>CFBundleExecutable</key> 8 | <string>$(EXECUTABLE_NAME)</string> 9 | <key>CFBundleIconFile</key> 10 | <string></string> 11 | <key>CFBundleIdentifier</key> 12 | <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> 13 | <key>CFBundleInfoDictionaryVersion</key> 14 | <string>6.0</string> 15 | <key>CFBundleName</key> 16 | <string>$(PRODUCT_NAME)</string> 17 | <key>CFBundlePackageType</key> 18 | <string>APPL</string> 19 | <key>CFBundleShortVersionString</key> 20 | <string>$(FLUTTER_BUILD_NAME)</string> 21 | <key>CFBundleVersion</key> 22 | <string>$(FLUTTER_BUILD_NUMBER)</string> 23 | <key>LSMinimumSystemVersion</key> 24 | <string>$(MACOSX_DEPLOYMENT_TARGET)</string> 25 | <key>NSHumanReadableCopyright</key> 26 | <string>$(PRODUCT_COPYRIGHT)</string> 27 | <key>NSMainNibFile</key> 28 | <string>MainMenu</string> 29 | <key>NSPrincipalClass</key> 30 | <string>NSApplication</string> 31 | </dict> 32 | </plist> 33 | -------------------------------------------------------------------------------- /example/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 | -------------------------------------------------------------------------------- /example/macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>com.apple.security.app-sandbox</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: example 2 | description: A new Flutter project. 3 | publish_to: 'none' 4 | version: 1.0.0+1 5 | 6 | 7 | environment: 8 | sdk: '>=3.0.0 <4.0.0' 9 | flutter: '>=3.10.0' 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | cupertino_icons: ^1.0.8 15 | screen_recorder: 16 | path: ../ 17 | 18 | dev_dependencies: 19 | flutter_test: 20 | sdk: flutter 21 | 22 | flutter_lints: ^4.0.0 23 | 24 | flutter: 25 | uses-material-design: true 26 | -------------------------------------------------------------------------------- /example/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:example/main.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_test/flutter_test.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(const MyApp()); 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 | -------------------------------------------------------------------------------- /example/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/web/favicon.png -------------------------------------------------------------------------------- /example/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/web/icons/Icon-192.png -------------------------------------------------------------------------------- /example/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Baseflow/screenrecorder/b98e33652411fe7c262cbea66631b6e0f6765d2a/example/web/icons/Icon-512.png -------------------------------------------------------------------------------- /example/web/index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html> 3 | <head> 4 | <!-- 5 | If you are serving your web app in a path other than the root, change the 6 | href value below to reflect the base path you are serving from. 7 | 8 | The path provided below has to start and end with a slash "/" in order for 9 | it to work correctly. 10 | 11 | Fore more details: 12 | * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base 13 | --> 14 | <base href="/"> 15 | 16 | <meta charset="UTF-8"> 17 | <meta content="IE=Edge" http-equiv="X-UA-Compatible"> 18 | <meta name="description" content="A new Flutter project."> 19 | 20 | <!-- iOS meta tags & icons --> 21 | <meta name="apple-mobile-web-app-capable" content="yes"> 22 | <meta name="apple-mobile-web-app-status-bar-style" content="black"> 23 | <meta name="apple-mobile-web-app-title" content="example"> 24 | <link rel="apple-touch-icon" href="icons/Icon-192.png"> 25 | 26 | <!-- Favicon --> 27 | <link rel="icon" type="image/png" href="favicon.png"/> 28 | 29 | <title>example 30 | 31 | 32 | 33 | 36 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /example/web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "short_name": "example", 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 | } 24 | -------------------------------------------------------------------------------- /img/screen_recorder.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | screen_recorder 6 | 7 | 8 | 🎥 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lib/screen_recorder.dart: -------------------------------------------------------------------------------- 1 | library screenrecorder; 2 | 3 | export 'src/exporter.dart'; 4 | export 'src/frame.dart'; 5 | export 'src/screen_recorder.dart'; 6 | -------------------------------------------------------------------------------- /lib/src/exporter.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui' as ui show ImageByteFormat; 2 | 3 | import 'package:flutter/foundation.dart'; 4 | import 'package:image/image.dart' as image; 5 | import 'frame.dart'; 6 | 7 | class Exporter { 8 | final List _frames = []; 9 | int _maxWidthFrame = 0; 10 | int _maxHeightFrame = 0; 11 | 12 | List get frames => _frames; 13 | 14 | void onNewFrame(Frame frame) { 15 | _frames.add(frame); 16 | } 17 | 18 | void clear() { 19 | _frames.clear(); 20 | 21 | _maxWidthFrame = 0; 22 | _maxHeightFrame = 0; 23 | } 24 | 25 | bool get hasFrames => _frames.isNotEmpty; 26 | 27 | Future?> exportFrames() async { 28 | if (_frames.isEmpty) { 29 | return null; 30 | } 31 | final bytesImages = []; 32 | for (final frame in _frames) { 33 | final bytesImage = 34 | await frame.image.toByteData(format: ui.ImageByteFormat.png); 35 | 36 | if (frame.image.width >= _maxWidthFrame) { 37 | _maxWidthFrame = frame.image.width; 38 | } 39 | 40 | if (frame.image.height >= _maxHeightFrame) { 41 | _maxHeightFrame = frame.image.height; 42 | } 43 | 44 | if (bytesImage != null) { 45 | bytesImages.add(RawFrame(16, bytesImage)); 46 | } else { 47 | debugPrint('Skipped frame while enconding'); 48 | } 49 | } 50 | return bytesImages; 51 | } 52 | 53 | Future?> exportGif() async { 54 | final frames = await exportFrames(); 55 | if (frames == null) { 56 | return null; 57 | } 58 | return compute( 59 | _exportGif, DataHolder(frames, _maxWidthFrame, _maxHeightFrame)); 60 | } 61 | 62 | static Future?> _exportGif(DataHolder data) async { 63 | List frames = data.frames; 64 | int width = data.width; 65 | int height = data.height; 66 | 67 | image.Image mainImage = image.Image.empty(); 68 | 69 | for (final frame in frames) { 70 | final iAsBytes = frame.image.buffer.asUint8List(); 71 | final decodedImage = image.decodePng(iAsBytes); 72 | 73 | if (decodedImage == null) { 74 | debugPrint('Skipped frame while enconding'); 75 | continue; 76 | } 77 | decodedImage.frameDuration = frame.durationInMillis; 78 | mainImage.frames.add( 79 | _encodeGifWIthTransparency( 80 | image.copyExpandCanvas( 81 | decodedImage, 82 | newWidth: width, 83 | newHeight: height, 84 | toImage: image.Image( 85 | width: width, 86 | height: height, 87 | format: decodedImage.format, 88 | numChannels: 4, 89 | ), 90 | ), 91 | ), 92 | ); 93 | } 94 | 95 | return image.encodeGif(mainImage); 96 | } 97 | 98 | static image.PaletteUint8 _convertPalette(image.Palette palette) { 99 | final newPalette = image.PaletteUint8(palette.numColors, 4); 100 | for (var i = 0; i < palette.numColors; i++) { 101 | newPalette.setRgba( 102 | i, palette.getRed(i), palette.getGreen(i), palette.getBlue(i), 255); 103 | } 104 | return newPalette; 105 | } 106 | 107 | static image.Image _encodeGifWIthTransparency(image.Image srcImage, 108 | {int transparencyThreshold = 1}) { 109 | final newImage = image.quantize(srcImage); 110 | 111 | // GifEncoder will use palette colors with a 0 alpha as transparent. Look at the pixels 112 | // of the original image and set the alpha of the palette color to 0 if the pixel is below 113 | // a transparency threshold. 114 | final numFrames = srcImage.frames.length; 115 | for (var frameIndex = 0; frameIndex < numFrames; frameIndex++) { 116 | final srcFrame = srcImage.frames[frameIndex]; 117 | final newFrame = newImage.frames[frameIndex]; 118 | 119 | final palette = _convertPalette(newImage.palette!); 120 | 121 | for (final srcPixel in srcFrame) { 122 | if (srcPixel.a < transparencyThreshold) { 123 | final newPixel = newFrame.getPixel(srcPixel.x, srcPixel.y); 124 | palette.setAlpha( 125 | newPixel.index.toInt(), 0); // Set the palette color alpha to 0 126 | } 127 | } 128 | 129 | newFrame.data!.palette = palette; 130 | } 131 | 132 | return newImage; 133 | } 134 | } 135 | 136 | class RawFrame { 137 | RawFrame(this.durationInMillis, this.image); 138 | 139 | final int durationInMillis; 140 | final ByteData image; 141 | } 142 | 143 | class DataHolder { 144 | DataHolder(this.frames, this.width, this.height); 145 | 146 | List frames; 147 | 148 | int width; 149 | int height; 150 | } 151 | -------------------------------------------------------------------------------- /lib/src/frame.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui' as ui show Image; 2 | 3 | class Frame { 4 | Frame(this.timeStamp, this.image); 5 | 6 | final Duration timeStamp; 7 | final ui.Image image; 8 | } 9 | -------------------------------------------------------------------------------- /lib/src/screen_recorder.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui' as ui show Image; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/rendering.dart'; 5 | import 'package:flutter/scheduler.dart'; 6 | import 'exporter.dart'; 7 | import 'frame.dart'; 8 | 9 | class ScreenRecorderController { 10 | ScreenRecorderController({ 11 | Exporter? exporter, 12 | this.pixelRatio = 0.5, 13 | this.skipFramesBetweenCaptures = 2, 14 | SchedulerBinding? binding, 15 | }) : _containerKey = GlobalKey(), 16 | _binding = binding ?? SchedulerBinding.instance, 17 | _exporter = exporter ?? Exporter(); 18 | 19 | final GlobalKey _containerKey; 20 | final SchedulerBinding _binding; 21 | final Exporter _exporter; 22 | 23 | Exporter get exporter => _exporter; 24 | 25 | /// The pixelRatio describes the scale between the logical pixels and the size 26 | /// of the output image. Specifying 1.0 will give you a 1:1 mapping between 27 | /// logical pixels and the output pixels in the image. The default is a pixel 28 | /// ration of 3 and a value below 1 is not recommended. 29 | /// 30 | /// See [RenderRepaintBoundary](https://api.flutter.dev/flutter/rendering/RenderRepaintBoundary/toImage.html) 31 | /// for the underlying implementation. 32 | final double pixelRatio; 33 | 34 | /// Describes how many frames are skipped between caputerd frames. 35 | /// For example if it's `skipFramesBetweenCaptures = 2` screen_recorder 36 | /// captures a frame, skips the next two frames and then captures the next 37 | /// frame again. 38 | final int skipFramesBetweenCaptures; 39 | 40 | int skipped = 0; 41 | 42 | bool _record = false; 43 | 44 | void start() { 45 | // only start a video, if no recording is in progress 46 | if (_record == true) { 47 | return; 48 | } 49 | _record = true; 50 | _binding.addPostFrameCallback(postFrameCallback); 51 | } 52 | 53 | void stop() { 54 | _record = false; 55 | } 56 | 57 | void postFrameCallback(Duration timestamp) async { 58 | if (_record == false) { 59 | return; 60 | } 61 | if (skipped > 0) { 62 | // count down frames which should be skipped 63 | skipped = skipped - 1; 64 | // add a new PostFrameCallback to know about the next frame 65 | _binding.addPostFrameCallback(postFrameCallback); 66 | // but we do nothing, because we skip this frame 67 | return; 68 | } 69 | if (skipped == 0) { 70 | // reset skipped frame counter 71 | skipped = skipped + skipFramesBetweenCaptures; 72 | } 73 | try { 74 | final image = capture(); 75 | if (image == null) { 76 | debugPrint('capture returned null'); 77 | return; 78 | } 79 | _exporter.onNewFrame(Frame(timestamp, image)); 80 | } catch (e) { 81 | debugPrint(e.toString()); 82 | } 83 | _binding.addPostFrameCallback(postFrameCallback); 84 | } 85 | 86 | ui.Image? capture() { 87 | final renderObject = _containerKey.currentContext!.findRenderObject() 88 | as RenderRepaintBoundary; 89 | 90 | return renderObject.toImageSync(pixelRatio: pixelRatio); 91 | } 92 | } 93 | 94 | class ScreenRecorder extends StatelessWidget { 95 | const ScreenRecorder({ 96 | super.key, 97 | required this.child, 98 | required this.controller, 99 | required this.width, 100 | required this.height, 101 | this.background = Colors.transparent, 102 | }); 103 | 104 | /// The child which should be recorded. 105 | final Widget child; 106 | 107 | /// This controller starts and stops the recording. 108 | final ScreenRecorderController controller; 109 | 110 | /// Width of the recording. 111 | /// This should not change during recording as it could lead to 112 | /// undefined behavior. 113 | final double width; 114 | 115 | /// Height of the recording 116 | /// This should not change during recording as it could lead to 117 | /// undefined behavior. 118 | final double height; 119 | 120 | /// The background color of the recording. 121 | /// Transparency is currently not supported. 122 | final Color background; 123 | 124 | @override 125 | Widget build(BuildContext context) { 126 | return RepaintBoundary( 127 | key: controller._containerKey, 128 | child: Container( 129 | width: width, 130 | height: height, 131 | color: background, 132 | alignment: Alignment.center, 133 | child: child, 134 | ), 135 | ); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: screen_recorder 2 | description: Record your Flutter widgets and export the recordings as a GIF 3 | version: 0.3.0 4 | repository: https://github.com/ueman/screenrecorder 5 | issue_tracker: https://github.com/ueman/screenrecorder/issues 6 | funding: 7 | - https://github.com/sponsors/ueman 8 | - https://www.buymeacoffee.com/jonasuekoetter 9 | topics: 10 | - gif 11 | - recording 12 | - screen 13 | - video 14 | 15 | environment: 16 | sdk: '>=3.0.0 <4.0.0' 17 | flutter: '>=3.10.0' 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | image: ^4.2.0 23 | 24 | dev_dependencies: 25 | flutter_test: 26 | sdk: flutter 27 | flutter_lints: ">=4.0.0 <6.0.0" 28 | -------------------------------------------------------------------------------- /test/screen_recorder_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:screen_recorder/screen_recorder.dart'; 3 | 4 | class CustomExporter extends Exporter {} 5 | 6 | void main() { 7 | TestWidgetsFlutterBinding.ensureInitialized(); 8 | 9 | test('ScreenRecorderController allows to use custom exporter', () { 10 | final exporter = CustomExporter(); 11 | final scrennRecorder = ScreenRecorderController(exporter: exporter); 12 | 13 | expect(scrennRecorder.exporter, equals(exporter)); 14 | }); 15 | } 16 | --------------------------------------------------------------------------------