From bed3174b1f3d3d9bafbc46a10fb19449f1e2fc54 Mon Sep 17 00:00:00 2001 From: Aricatos Date: Thu, 6 Aug 2026 23:19:06 +1000 Subject: [PATCH 1/2] Migrate Android plugins to built-in Kotlin --- .github/workflows/code-analysis.yml | 62 ++++++++++++++++++- packages/example/android/app/build.gradle.kts | 13 ++-- packages/example/android/gradle.properties | 3 +- packages/example/pubspec.lock | 4 +- packages/example/pubspec.yaml | 4 +- packages/google_ml_kit/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../google_mlkit_commons/android/build.gradle | 13 ++-- packages/google_mlkit_commons/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_face_detection/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_genai_prompt/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_genai_rewriting/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_image_labeling/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_language_id/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_pose_detection/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_smart_reply/pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../pubspec.yaml | 4 +- .../android/build.gradle | 13 ++-- .../google_mlkit_translation/pubspec.yaml | 4 +- 50 files changed, 251 insertions(+), 213 deletions(-) diff --git a/.github/workflows/code-analysis.yml b/.github/workflows/code-analysis.yml index 09794709..5d54e34c 100644 --- a/.github/workflows/code-analysis.yml +++ b/.github/workflows/code-analysis.yml @@ -20,11 +20,11 @@ jobs: - uses: actions/checkout@v7.0.1 - uses: actions/setup-java@v5.6.0 with: - java-version: 11 + java-version: 17 distribution: temurin - uses: subosito/flutter-action@v2.23.0 with: - flutter-version: '3.35.3' + flutter-version: '3.44.8' cache: true - name: Install dependencies for google_ml_kit @@ -140,3 +140,61 @@ jobs: run: brew install swiftlint - name: Run SwiftLint on Swift code run: swiftlint lint + + build-android: + name: Build Android example without plugin KGP warnings + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v7.0.1 + - uses: actions/setup-java@v5.6.0 + with: + java-version: 17 + distribution: temurin + - uses: subosito/flutter-action@v2.23.0 + with: + flutter-version: '3.44.8' + cache: true + - name: Install dependencies + working-directory: ./packages/example + run: flutter pub get + - name: Build Android example + working-directory: ./packages/example + shell: bash + run: | + set -o pipefail + flutter build apk --debug 2>&1 | tee android-build.log + ! grep -F "plugins that apply Kotlin Gradle Plugin" android-build.log + + # Flutter only supports enabling AGP 9's built-in Kotlin from 3.47 onward. + # Keep this beta lane until 3.47 is stable, then pin the stable release. + build-android-built-in-kotlin: + name: Build Android example with AGP 9 built-in Kotlin + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v7.0.1 + - uses: actions/setup-java@v5.6.0 + with: + java-version: 21 + distribution: temurin + - uses: subosito/flutter-action@v2.23.0 + with: + flutter-version: '3.47.0-0.2.pre' + channel: beta + cache: true + - name: Enable AGP 9 built-in Kotlin + working-directory: ./packages/example + shell: bash + run: | + perl -pi -e 's/version "8\.13\.0"/version "9.3.1"/' android/settings.gradle.kts + perl -pi -e 's/gradle-8\.14\.3-all\.zip/gradle-9.6.1-all.zip/' android/gradle/wrapper/gradle-wrapper.properties + perl -pi -e 's/android\.builtInKotlin=false/android.builtInKotlin=true/' android/gradle.properties + - name: Install dependencies + working-directory: ./packages/example + run: flutter pub get + - name: Build Android example + working-directory: ./packages/example + shell: bash + run: | + set -o pipefail + flutter build apk --debug 2>&1 | tee android-build.log + ! grep -E 'plugins that apply Kotlin Gradle Plugin|applies the Kotlin Gradle Plugin|KGP\) was unsuccessful' android-build.log diff --git a/packages/example/android/app/build.gradle.kts b/packages/example/android/app/build.gradle.kts index 523c9a98..acdee4a9 100644 --- a/packages/example/android/app/build.gradle.kts +++ b/packages/example/android/app/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("com.android.application") - id("kotlin-android") - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + // The Flutter Gradle Plugin must be applied after the Android Gradle plugin. id("dev.flutter.flutter-gradle-plugin") } @@ -14,10 +13,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() - } - defaultConfig { applicationId = "com.google.ml.kit.flutter.example" minSdk = 26 @@ -37,6 +32,12 @@ android { } } +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} + dependencies { // Add language package you need to use implementation("com.google.mlkit:text-recognition-chinese:16.0.1") diff --git a/packages/example/android/gradle.properties b/packages/example/android/gradle.properties index f018a618..204862a6 100644 --- a/packages/example/android/gradle.properties +++ b/packages/example/android/gradle.properties @@ -1,3 +1,4 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true -android.enableJetifier=true +android.newDsl=false +android.builtInKotlin=false diff --git a/packages/example/pubspec.lock b/packages/example/pubspec.lock index ca571f39..3c6de35d 100644 --- a/packages/example/pubspec.lock +++ b/packages/example/pubspec.lock @@ -656,5 +656,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.10.0-0 <4.0.0" - flutter: ">=3.35.0" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" diff --git a/packages/example/pubspec.yaml b/packages/example/pubspec.yaml index a5bf59db..b8d09980 100644 --- a/packages/example/pubspec.yaml +++ b/packages/example/pubspec.yaml @@ -7,8 +7,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.4.0 <4.0.0' - flutter: '>=3.22.0' + sdk: ^3.12.0 + flutter: '>=3.44.0' dependencies: camera: ^0.11.1 diff --git a/packages/google_ml_kit/pubspec.yaml b/packages/google_ml_kit/pubspec.yaml index 8a7b4afd..b2c1aa4e 100644 --- a/packages/google_ml_kit/pubspec.yaml +++ b/packages/google_ml_kit/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_ml_kit environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_barcode_scanning/android/build.gradle b/packages/google_mlkit_barcode_scanning/android/build.gradle index b09e073d..0a7d3f01 100644 --- a/packages/google_mlkit_barcode_scanning/android/build.gradle +++ b/packages/google_mlkit_barcode_scanning/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_barcode_scanning" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20") } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_barcode_scanning" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_barcode_scanning/pubspec.yaml b/packages/google_mlkit_barcode_scanning/pubspec.yaml index 9a38d4f1..f770f109 100644 --- a/packages/google_mlkit_barcode_scanning/pubspec.yaml +++ b/packages/google_mlkit_barcode_scanning/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_barcode_scanning environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_commons/android/build.gradle b/packages/google_mlkit_commons/android/build.gradle index 7566058b..3318a094 100644 --- a/packages/google_mlkit_commons/android/build.gradle +++ b/packages/google_mlkit_commons/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_commons" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20") } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_commons" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_commons/pubspec.yaml b/packages/google_mlkit_commons/pubspec.yaml index 2b5942e8..d4deb75c 100644 --- a/packages/google_mlkit_commons/pubspec.yaml +++ b/packages/google_mlkit_commons/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_commons environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_digital_ink_recognition/android/build.gradle b/packages/google_mlkit_digital_ink_recognition/android/build.gradle index 454eb066..6a7b146a 100644 --- a/packages/google_mlkit_digital_ink_recognition/android/build.gradle +++ b/packages/google_mlkit_digital_ink_recognition/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_digital_ink_recognition" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_digital_ink_recognition" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_digital_ink_recognition/pubspec.yaml b/packages/google_mlkit_digital_ink_recognition/pubspec.yaml index 462f78ec..2d42b008 100644 --- a/packages/google_mlkit_digital_ink_recognition/pubspec.yaml +++ b/packages/google_mlkit_digital_ink_recognition/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_digital_ink_recognition environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_document_scanner/android/build.gradle b/packages/google_mlkit_document_scanner/android/build.gradle index 1566c99a..1a59887f 100644 --- a/packages/google_mlkit_document_scanner/android/build.gradle +++ b/packages/google_mlkit_document_scanner/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_document_scanner" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_document_scanner" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_document_scanner/pubspec.yaml b/packages/google_mlkit_document_scanner/pubspec.yaml index 193d8bfa..ce30c650 100644 --- a/packages/google_mlkit_document_scanner/pubspec.yaml +++ b/packages/google_mlkit_document_scanner/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_document_scanner environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_entity_extraction/android/build.gradle b/packages/google_mlkit_entity_extraction/android/build.gradle index 5fbb5d54..f5647373 100644 --- a/packages/google_mlkit_entity_extraction/android/build.gradle +++ b/packages/google_mlkit_entity_extraction/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_entity_extraction" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_entity_extraction" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_entity_extraction/pubspec.yaml b/packages/google_mlkit_entity_extraction/pubspec.yaml index 47ba01e0..97ace177 100644 --- a/packages/google_mlkit_entity_extraction/pubspec.yaml +++ b/packages/google_mlkit_entity_extraction/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_entity_extraction environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_face_detection/android/build.gradle b/packages/google_mlkit_face_detection/android/build.gradle index 646fe42c..b3ecd400 100644 --- a/packages/google_mlkit_face_detection/android/build.gradle +++ b/packages/google_mlkit_face_detection/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_face_detection" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_face_detection" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_face_detection/pubspec.yaml b/packages/google_mlkit_face_detection/pubspec.yaml index ea1bd282..0e72644a 100644 --- a/packages/google_mlkit_face_detection/pubspec.yaml +++ b/packages/google_mlkit_face_detection/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_face_detection environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_face_mesh_detection/android/build.gradle b/packages/google_mlkit_face_mesh_detection/android/build.gradle index e54a19cc..2e2a9a71 100644 --- a/packages/google_mlkit_face_mesh_detection/android/build.gradle +++ b/packages/google_mlkit_face_mesh_detection/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_face_mesh_detection" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_face_mesh_detection" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_face_mesh_detection/pubspec.yaml b/packages/google_mlkit_face_mesh_detection/pubspec.yaml index e2c37e90..cf4ed3bf 100644 --- a/packages/google_mlkit_face_mesh_detection/pubspec.yaml +++ b/packages/google_mlkit_face_mesh_detection/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_face_mesh_detection environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_image_description/android/build.gradle b/packages/google_mlkit_genai_image_description/android/build.gradle index 76900e25..153869d1 100644 --- a/packages/google_mlkit_genai_image_description/android/build.gradle +++ b/packages/google_mlkit_genai_image_description/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_image_description" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_image_description" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_image_description/pubspec.yaml b/packages/google_mlkit_genai_image_description/pubspec.yaml index fafc79c8..95f6a7b3 100644 --- a/packages/google_mlkit_genai_image_description/pubspec.yaml +++ b/packages/google_mlkit_genai_image_description/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_image_description environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_prompt/android/build.gradle b/packages/google_mlkit_genai_prompt/android/build.gradle index 90e55b7f..8287d440 100644 --- a/packages/google_mlkit_genai_prompt/android/build.gradle +++ b/packages/google_mlkit_genai_prompt/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_prompt" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_prompt" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_prompt/pubspec.yaml b/packages/google_mlkit_genai_prompt/pubspec.yaml index 61fa7191..f0639ffb 100644 --- a/packages/google_mlkit_genai_prompt/pubspec.yaml +++ b/packages/google_mlkit_genai_prompt/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_prompt environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_proofreading/android/build.gradle b/packages/google_mlkit_genai_proofreading/android/build.gradle index c9afe2c5..76c73464 100644 --- a/packages/google_mlkit_genai_proofreading/android/build.gradle +++ b/packages/google_mlkit_genai_proofreading/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_proofreading" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_proofreading" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_proofreading/pubspec.yaml b/packages/google_mlkit_genai_proofreading/pubspec.yaml index 2d06ce10..e8ba2721 100644 --- a/packages/google_mlkit_genai_proofreading/pubspec.yaml +++ b/packages/google_mlkit_genai_proofreading/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_proofreading environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_rewriting/android/build.gradle b/packages/google_mlkit_genai_rewriting/android/build.gradle index 2d758944..caca961f 100644 --- a/packages/google_mlkit_genai_rewriting/android/build.gradle +++ b/packages/google_mlkit_genai_rewriting/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_rewriting" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_rewriting" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_rewriting/pubspec.yaml b/packages/google_mlkit_genai_rewriting/pubspec.yaml index 6282d6ce..b25fbcb3 100644 --- a/packages/google_mlkit_genai_rewriting/pubspec.yaml +++ b/packages/google_mlkit_genai_rewriting/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_rewriting environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_speech_recognition/android/build.gradle b/packages/google_mlkit_genai_speech_recognition/android/build.gradle index 21562d81..f82647a4 100644 --- a/packages/google_mlkit_genai_speech_recognition/android/build.gradle +++ b/packages/google_mlkit_genai_speech_recognition/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_speech_recognition" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_speech_recognition" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_speech_recognition/pubspec.yaml b/packages/google_mlkit_genai_speech_recognition/pubspec.yaml index 5be2750f..87b60b30 100644 --- a/packages/google_mlkit_genai_speech_recognition/pubspec.yaml +++ b/packages/google_mlkit_genai_speech_recognition/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_speech_recognition environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_genai_summarization/android/build.gradle b/packages/google_mlkit_genai_summarization/android/build.gradle index 3aaadd79..6b0c3837 100644 --- a/packages/google_mlkit_genai_summarization/android/build.gradle +++ b/packages/google_mlkit_genai_summarization/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_genai_summarization" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_genai_summarization" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_genai_summarization/pubspec.yaml b/packages/google_mlkit_genai_summarization/pubspec.yaml index a00d3634..02f68953 100644 --- a/packages/google_mlkit_genai_summarization/pubspec.yaml +++ b/packages/google_mlkit_genai_summarization/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_genai_summarization environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_image_labeling/android/build.gradle b/packages/google_mlkit_image_labeling/android/build.gradle index bca2f237..5b776d06 100644 --- a/packages/google_mlkit_image_labeling/android/build.gradle +++ b/packages/google_mlkit_image_labeling/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_image_labeling" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_image_labeling" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_image_labeling/pubspec.yaml b/packages/google_mlkit_image_labeling/pubspec.yaml index 6e623094..ca1da134 100644 --- a/packages/google_mlkit_image_labeling/pubspec.yaml +++ b/packages/google_mlkit_image_labeling/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_image_labeling environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_language_id/android/build.gradle b/packages/google_mlkit_language_id/android/build.gradle index 861b74fe..addd8e05 100644 --- a/packages/google_mlkit_language_id/android/build.gradle +++ b/packages/google_mlkit_language_id/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_language_id" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_language_id" @@ -33,10 +36,6 @@ android { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_language_id/pubspec.yaml b/packages/google_mlkit_language_id/pubspec.yaml index 7bafde6c..b70f9efa 100644 --- a/packages/google_mlkit_language_id/pubspec.yaml +++ b/packages/google_mlkit_language_id/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_language_id environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_object_detection/android/build.gradle b/packages/google_mlkit_object_detection/android/build.gradle index d854149f..841a8e22 100644 --- a/packages/google_mlkit_object_detection/android/build.gradle +++ b/packages/google_mlkit_object_detection/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_object_detection" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_object_detection" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_object_detection/pubspec.yaml b/packages/google_mlkit_object_detection/pubspec.yaml index 32a05ddf..60e0efbd 100644 --- a/packages/google_mlkit_object_detection/pubspec.yaml +++ b/packages/google_mlkit_object_detection/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_object_detection environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_pose_detection/android/build.gradle b/packages/google_mlkit_pose_detection/android/build.gradle index f8021fb4..ff405d39 100644 --- a/packages/google_mlkit_pose_detection/android/build.gradle +++ b/packages/google_mlkit_pose_detection/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_pose_detection" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_pose_detection" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_pose_detection/pubspec.yaml b/packages/google_mlkit_pose_detection/pubspec.yaml index 070c4332..062c109a 100644 --- a/packages/google_mlkit_pose_detection/pubspec.yaml +++ b/packages/google_mlkit_pose_detection/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_pose_detection environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_selfie_segmentation/android/build.gradle b/packages/google_mlkit_selfie_segmentation/android/build.gradle index c3d3c50f..c6c3843c 100644 --- a/packages/google_mlkit_selfie_segmentation/android/build.gradle +++ b/packages/google_mlkit_selfie_segmentation/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_selfie_segmentation" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_selfie_segmentation" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_selfie_segmentation/pubspec.yaml b/packages/google_mlkit_selfie_segmentation/pubspec.yaml index 3812ed3d..8ad6df2f 100644 --- a/packages/google_mlkit_selfie_segmentation/pubspec.yaml +++ b/packages/google_mlkit_selfie_segmentation/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_selfie_segmentation environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_smart_reply/android/build.gradle b/packages/google_mlkit_smart_reply/android/build.gradle index fff8974b..2c594b21 100644 --- a/packages/google_mlkit_smart_reply/android/build.gradle +++ b/packages/google_mlkit_smart_reply/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_smart_reply" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_smart_reply" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_smart_reply/pubspec.yaml b/packages/google_mlkit_smart_reply/pubspec.yaml index f1d16240..859fdee7 100644 --- a/packages/google_mlkit_smart_reply/pubspec.yaml +++ b/packages/google_mlkit_smart_reply/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_smart_reply environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_subject_segmentation/android/build.gradle b/packages/google_mlkit_subject_segmentation/android/build.gradle index 51f7da16..88d91e60 100644 --- a/packages/google_mlkit_subject_segmentation/android/build.gradle +++ b/packages/google_mlkit_subject_segmentation/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_subject_segmentation" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_subject_segmentation" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_subject_segmentation/pubspec.yaml b/packages/google_mlkit_subject_segmentation/pubspec.yaml index ebd02666..681a3808 100644 --- a/packages/google_mlkit_subject_segmentation/pubspec.yaml +++ b/packages/google_mlkit_subject_segmentation/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_subject_segmentation environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_text_recognition/android/build.gradle b/packages/google_mlkit_text_recognition/android/build.gradle index 729486e6..367e7b3d 100644 --- a/packages/google_mlkit_text_recognition/android/build.gradle +++ b/packages/google_mlkit_text_recognition/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_text_recognition" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_text_recognition" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_text_recognition/pubspec.yaml b/packages/google_mlkit_text_recognition/pubspec.yaml index d23933a1..ebcc2dc8 100644 --- a/packages/google_mlkit_text_recognition/pubspec.yaml +++ b/packages/google_mlkit_text_recognition/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_text_recognition environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: diff --git a/packages/google_mlkit_translation/android/build.gradle b/packages/google_mlkit_translation/android/build.gradle index ab875ec2..c6f0bc5c 100644 --- a/packages/google_mlkit_translation/android/build.gradle +++ b/packages/google_mlkit_translation/android/build.gradle @@ -2,7 +2,6 @@ group = "com.google_mlkit_translation" version = "1.0" buildscript { - ext.kotlin_version = "2.2.20" repositories { google() mavenCentral() @@ -10,7 +9,6 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle:8.13.0") - classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20') } } @@ -22,7 +20,12 @@ rootProject.allprojects { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11 + } +} android { namespace = "com.google_mlkit_translation" @@ -34,10 +37,6 @@ android { targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = '11' - } - sourceSets { main.java.srcDirs += "src/main/kotlin" } diff --git a/packages/google_mlkit_translation/pubspec.yaml b/packages/google_mlkit_translation/pubspec.yaml index f18c2dd0..dab679b5 100644 --- a/packages/google_mlkit_translation/pubspec.yaml +++ b/packages/google_mlkit_translation/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://github.com/flutter-ml/google_ml_kit_flutter repository: https://github.com/flutter-ml/google_ml_kit_flutter/tree/master/packages/google_mlkit_translation environment: - sdk: ">=3.8.0 <4.0.0" - flutter: ">=3.32.0" + sdk: ^3.12.0 + flutter: ">=3.44.0" dependencies: flutter: From c041de7d8c8aa58234a32ba8968907a3db855b7b Mon Sep 17 00:00:00 2001 From: Aricatos Date: Thu, 6 Aug 2026 23:28:08 +1000 Subject: [PATCH 2/2] Format example with Dart 3.12 --- .../activity_indicator.dart | 69 +++-- packages/example/lib/main.dart | 83 +++--- .../entity_extraction_view.dart | 104 +++---- .../language_identifier_view.dart | 61 ++-- .../language_translator_view.dart | 242 ++++++++------- .../nlp_detector_views/smart_reply_view.dart | 73 ++--- .../vision_detector_views/camera_view.dart | 278 +++++++++--------- .../vision_detector_views/detector_view.dart | 3 +- .../digital_ink_recognizer_view.dart | 121 ++++---- .../document_scanner_view.dart | 73 +++-- .../face_detector_view.dart | 5 +- .../face_mesh_detector_view.dart | 14 +- .../vision_detector_views/gallery_view.dart | 208 ++++++------- .../label_detector_view.dart | 3 +- .../object_detector_view.dart | 97 +++--- .../painters/barcode_detector_painter.dart | 24 +- .../painters/face_detector_painter.dart | 67 +++-- .../painters/face_mesh_detector_painter.dart | 5 +- .../painters/label_detector_painter.dart | 18 +- .../painters/object_detector_painter.dart | 34 +-- .../painters/pose_painter.dart | 154 ++++++---- .../subject_segmentation_painter.dart | 24 +- .../painters/text_detector_painter.dart | 30 +- .../pose_detector_view.dart | 5 +- .../subject_segmenter_view.dart | 5 +- .../text_detector_view.dart | 85 +++--- .../text_from_widget_view.dart | 19 +- .../lib/vision_detector_views/utils.dart | 8 +- 28 files changed, 1004 insertions(+), 908 deletions(-) diff --git a/packages/example/lib/activity_indicator/activity_indicator.dart b/packages/example/lib/activity_indicator/activity_indicator.dart index 72d28837..3fc1cb2f 100644 --- a/packages/example/lib/activity_indicator/activity_indicator.dart +++ b/packages/example/lib/activity_indicator/activity_indicator.dart @@ -3,17 +3,21 @@ import 'package:flutter/material.dart'; class Toast { - void show(String message, Future t, BuildContext context, - State state) async { + void show( + String message, + Future t, + BuildContext context, + State state, + ) async { ScaffoldMessenger.of(context).hideCurrentSnackBar(); showLoadingIndicator(context, message); final verificationResult = await t; Navigator.of(context).pop(); if (!state.mounted) return; ScaffoldMessenger.of(context).hideCurrentSnackBar(); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('Result: ${verificationResult.toString()}'), - )); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Result: ${verificationResult.toString()}')), + ); } void showLoadingIndicator(BuildContext context, String text) { @@ -22,13 +26,15 @@ class Toast { barrierDismissible: false, builder: (BuildContext context) { return PopScope( - canPop: false, - child: AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(8.0))), - backgroundColor: Colors.black87, - content: LoadingIndicator(text: text), - )); + canPop: false, + child: AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + ), + backgroundColor: Colors.black87, + content: LoadingIndicator(text: text), + ), + ); }, ); } @@ -42,31 +48,36 @@ class LoadingIndicator extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.all(16), - color: Colors.black.withAlpha(204), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [_getLoadingIndicator(), _getHeading(), _getText(text)])); + padding: EdgeInsets.all(16), + color: Colors.black.withAlpha(204), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [_getLoadingIndicator(), _getHeading(), _getText(text)], + ), + ); } Widget _getLoadingIndicator() { return Padding( - padding: EdgeInsets.only(bottom: 16), - child: SizedBox( - width: 32, - height: 32, - child: CircularProgressIndicator(strokeWidth: 3))); + padding: EdgeInsets.only(bottom: 16), + child: SizedBox( + width: 32, + height: 32, + child: CircularProgressIndicator(strokeWidth: 3), + ), + ); } Widget _getHeading() { return Padding( - padding: EdgeInsets.only(bottom: 4), - child: Text( - 'Please wait …', - style: TextStyle(color: Colors.white, fontSize: 16), - textAlign: TextAlign.center, - )); + padding: EdgeInsets.only(bottom: 4), + child: Text( + 'Please wait …', + style: TextStyle(color: Colors.white, fontSize: 16), + textAlign: TextAlign.center, + ), + ); } Widget _getText(String displayedText) { diff --git a/packages/example/lib/main.dart b/packages/example/lib/main.dart index 0238330e..3e58b9bc 100644 --- a/packages/example/lib/main.dart +++ b/packages/example/lib/main.dart @@ -27,10 +27,7 @@ Future main() async { class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - home: Home(), - ); + return MaterialApp(debugShowCheckedModeBanner: false, home: Home()); } } @@ -57,7 +54,9 @@ class Home extends StatelessWidget { CustomCard('Face Detection', FaceDetectorView()), if (Platform.isAndroid) CustomCard( - 'Face Mesh Detection', FaceMeshDetectorView()), + 'Face Mesh Detection', + FaceMeshDetectorView(), + ), CustomCard('Image Labeling', ImageLabelView()), CustomCard('Object Detection', ObjectDetectorView()), CustomCard('Text Recognition', TextRecognizerView()), @@ -69,39 +68,49 @@ class Home extends StatelessWidget { CustomCard('Document Scanner', DocumentScannerView()), if (Platform.isAndroid) CustomCard( - 'Subject Segmentation', SubjectSegmenterView()) + 'Subject Segmentation', + SubjectSegmenterView(), + ), ], ), - SizedBox( - height: 20, - ), + SizedBox(height: 20), ExpansionTile( title: const Text('Natural Language APIs'), children: [ CustomCard('Language ID', LanguageIdentifierView()), CustomCard( - 'On-device Translation', LanguageTranslatorView()), + 'On-device Translation', + LanguageTranslatorView(), + ), CustomCard('Smart Reply', SmartReplyView()), CustomCard('Entity Extraction', EntityExtractionView()), ], ), - SizedBox( - height: 20, - ), + SizedBox(height: 20), if (Platform.isAndroid) ExpansionTile( title: const Text('GenAI APIs'), children: [ - CustomCard('Summarization', - _GenAIPlaceholderView('Summarization')), - CustomCard('Proofreading', - _GenAIPlaceholderView('Proofreading')), CustomCard( - 'Rewriting', _GenAIPlaceholderView('Rewriting')), - CustomCard('Image Description', - _GenAIPlaceholderView('Image Description')), - CustomCard('Speech Recognition', - _GenAIPlaceholderView('Speech Recognition')), + 'Summarization', + _GenAIPlaceholderView('Summarization'), + ), + CustomCard( + 'Proofreading', + _GenAIPlaceholderView('Proofreading'), + ), + CustomCard( + 'Rewriting', + _GenAIPlaceholderView('Rewriting'), + ), + CustomCard( + 'Image Description', + _GenAIPlaceholderView('Image Description'), + ), + CustomCard( + 'Speech Recognition', + _GenAIPlaceholderView('Speech Recognition'), + ), CustomCard('Prompt', _GenAIPlaceholderView('Prompt')), ], ), @@ -123,20 +132,14 @@ class _GenAIPlaceholderView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text('$featureName (GenAI)'), - ), + appBar: AppBar(title: Text('$featureName (GenAI)')), body: Center( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.info_outline, - size: 64, - color: Colors.blue, - ), + Icon(Icons.info_outline, size: 64, color: Colors.blue), SizedBox(height: 16), Text( '$featureName API', @@ -152,9 +155,9 @@ class _GenAIPlaceholderView extends StatelessWidget { Text( 'Implementation coming soon.', textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - fontStyle: FontStyle.italic, - ), + style: Theme.of( + context, + ).textTheme.bodySmall?.copyWith(fontStyle: FontStyle.italic), ), ], ), @@ -184,12 +187,18 @@ class CustomCard extends StatelessWidget { ), onTap: () { if (!featureCompleted) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: - const Text('This feature has not been implemented yet'))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text( + 'This feature has not been implemented yet', + ), + ), + ); } else { Navigator.push( - context, MaterialPageRoute(builder: (context) => _viewPage)); + context, + MaterialPageRoute(builder: (context) => _viewPage), + ); } }, ), diff --git a/packages/example/lib/nlp_detector_views/entity_extraction_view.dart b/packages/example/lib/nlp_detector_views/entity_extraction_view.dart index b1bf2d09..197410fe 100644 --- a/packages/example/lib/nlp_detector_views/entity_extraction_view.dart +++ b/packages/example/lib/nlp_detector_views/entity_extraction_view.dart @@ -11,8 +11,9 @@ class EntityExtractionView extends StatefulWidget { class _EntityExtractionViewState extends State { final _controller = TextEditingController(); final _modelManager = EntityExtractorModelManager(); - final _entityExtractor = - EntityExtractor(language: EntityExtractorLanguage.english); + final _entityExtractor = EntityExtractor( + language: EntityExtractorLanguage.english, + ); var _entities = []; final _language = EntityExtractorLanguage.english; @@ -26,9 +27,7 @@ class _EntityExtractionViewState extends State { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - appBar: AppBar( - title: const Text('Entity Extractor'), - ), + appBar: AppBar(title: const Text('Entity Extractor')), body: GestureDetector( onTap: () { FocusScope.of(context).unfocus(); @@ -36,18 +35,13 @@ class _EntityExtractionViewState extends State { child: SingleChildScrollView( child: Column( children: [ - const SizedBox( - height: 20, - ), + const SizedBox(height: 20), const Center(child: Text('Enter text (English)')), Padding( padding: const EdgeInsets.all(20.0), child: Container( padding: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( - border: Border.all( - width: 2, - )), + decoration: BoxDecoration(border: Border.all(width: 2)), child: TextField( controller: _controller, decoration: InputDecoration(border: InputBorder.none), @@ -55,33 +49,40 @@ class _EntityExtractionViewState extends State { ), ), ), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( onPressed: _extractEntities, - child: Text('Extract Entities')) - ]), + child: Text('Extract Entities'), + ), + ], + ), const SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( - onPressed: _downloadModel, - child: Text('Download Model')), + onPressed: _downloadModel, + child: Text('Download Model'), + ), ElevatedButton( - onPressed: _deleteModel, child: Text('Delete Model')), + onPressed: _deleteModel, + child: Text('Delete Model'), + ), ], ), SizedBox(height: 20), Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - ElevatedButton( - onPressed: _isModelDownloaded, - child: Text('Check download')) - ]), - const SizedBox( - height: 30, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + ElevatedButton( + onPressed: _isModelDownloaded, + child: Text('Check download'), + ), + ], ), + const SizedBox(height: 30), Container( padding: const EdgeInsets.symmetric(horizontal: 30), child: const Text('Result', style: TextStyle(fontSize: 20)), @@ -92,11 +93,11 @@ class _EntityExtractionViewState extends State { physics: NeverScrollableScrollPhysics(), itemCount: _entities.length, itemBuilder: (context, index) => ExpansionTile( - title: Text(_entities[index].text), - children: _entities[index] - .entities - .map((e) => Text(e.toString())) - .toList()), + title: Text(_entities[index].text), + children: _entities[index].entities + .map((e) => Text(e.toString())) + .toList(), + ), ), ], ), @@ -108,32 +109,35 @@ class _EntityExtractionViewState extends State { Future _downloadModel() async { Toast().show( - 'Downloading model...', - _modelManager - .downloadModel(_language.name) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Downloading model...', + _modelManager + .downloadModel(_language.name) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _deleteModel() async { Toast().show( - 'Deleting model...', - _modelManager - .deleteModel(_language.name) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Deleting model...', + _modelManager + .deleteModel(_language.name) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _isModelDownloaded() async { Toast().show( - 'Checking if model is downloaded...', - _modelManager - .isModelDownloaded(_language.name) - .then((value) => value ? 'downloaded' : 'not downloaded'), - context, - this); + 'Checking if model is downloaded...', + _modelManager + .isModelDownloaded(_language.name) + .then((value) => value ? 'downloaded' : 'not downloaded'), + context, + this, + ); } Future _extractEntities() async { diff --git a/packages/example/lib/nlp_detector_views/language_identifier_view.dart b/packages/example/lib/nlp_detector_views/language_identifier_view.dart index b5268fc8..1e9c64d5 100644 --- a/packages/example/lib/nlp_detector_views/language_identifier_view.dart +++ b/packages/example/lib/nlp_detector_views/language_identifier_view.dart @@ -23,40 +23,45 @@ class _LanguageIdentifierViewState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Language Identification')), - body: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding( - padding: const EdgeInsets.all(15.0), - child: TextField( - controller: _controller, + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(15.0), + child: TextField(controller: _controller), ), - ), - SizedBox(height: 15), - _identifiedLanguage == '' - ? Container() - : Container( - margin: EdgeInsets.only(bottom: 5), - child: Text( - 'Identified Language: $_identifiedLanguage', - style: TextStyle(fontSize: 20), - )), - ElevatedButton( + SizedBox(height: 15), + _identifiedLanguage == '' + ? Container() + : Container( + margin: EdgeInsets.only(bottom: 5), + child: Text( + 'Identified Language: $_identifiedLanguage', + style: TextStyle(fontSize: 20), + ), + ), + ElevatedButton( onPressed: _identifyLanguage, - child: const Text('Identify Language')), - SizedBox(height: 15), - ElevatedButton( - onPressed: _identifyPossibleLanguages, - child: const Text('Identify possible languages'), - ), - ListView.builder( + child: const Text('Identify Language'), + ), + SizedBox(height: 15), + ElevatedButton( + onPressed: _identifyPossibleLanguages, + child: const Text('Identify possible languages'), + ), + ListView.builder( shrinkWrap: true, itemCount: _identifiedLanguages.length, itemBuilder: (context, index) { return ListTile( title: Text( - 'Language: ${_identifiedLanguages[index].languageTag} Confidence: ${_identifiedLanguages[index].confidence.toString()}'), + 'Language: ${_identifiedLanguages[index].languageTag} Confidence: ${_identifiedLanguages[index].confidence.toString()}', + ), ); - }) - ]), + }, + ), + ], + ), ); } @@ -82,8 +87,8 @@ class _LanguageIdentifierViewState extends State { if (_controller.text == '') return; String error; try { - final possibleLanguages = - await _languageIdentifier.identifyPossibleLanguages(_controller.text); + final possibleLanguages = await _languageIdentifier + .identifyPossibleLanguages(_controller.text); setState(() { _identifiedLanguages = possibleLanguages; }); diff --git a/packages/example/lib/nlp_detector_views/language_translator_view.dart b/packages/example/lib/nlp_detector_views/language_translator_view.dart index f8ec9f9b..60d0810f 100644 --- a/packages/example/lib/nlp_detector_views/language_translator_view.dart +++ b/packages/example/lib/nlp_detector_views/language_translator_view.dart @@ -15,8 +15,9 @@ class _LanguageTranslatorViewState extends State { var _sourceLanguage = TranslateLanguage.english; var _targetLanguage = TranslateLanguage.spanish; var _onDeviceTranslator = OnDeviceTranslator( - sourceLanguage: TranslateLanguage.english, - targetLanguage: TranslateLanguage.spanish); + sourceLanguage: TranslateLanguage.english, + targetLanguage: TranslateLanguage.spanish, + ); @override void dispose() { @@ -28,9 +29,7 @@ class _LanguageTranslatorViewState extends State { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - appBar: AppBar( - title: const Text('On-device Translation'), - ), + appBar: AppBar(title: const Text('On-device Translation')), body: GestureDetector( onTap: () { FocusScope.of(context).unfocus(); @@ -39,24 +38,23 @@ class _LanguageTranslatorViewState extends State { children: [ SizedBox(height: 30), Center( - child: Text('Enter text (source: ${_sourceLanguage.name})')), + child: Text('Enter text (source: ${_sourceLanguage.name})'), + ), Padding( padding: const EdgeInsets.all(20.0), child: Row( children: [ Expanded( - child: Container( - padding: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( - border: Border.all( - width: 2, - )), - child: TextField( - controller: _controller, - decoration: InputDecoration(border: InputBorder.none), - maxLines: null, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration(border: Border.all(width: 2)), + child: TextField( + controller: _controller, + decoration: InputDecoration(border: InputBorder.none), + maxLines: null, + ), ), - )), + ), SizedBox(width: 20), _buildDropdown(false), ], @@ -64,21 +62,21 @@ class _LanguageTranslatorViewState extends State { ), SizedBox(height: 30), Center( - child: Text( - 'Translated Text (target: ${_targetLanguage.name})')), + child: Text( + 'Translated Text (target: ${_targetLanguage.name})', + ), + ), Padding( padding: const EdgeInsets.all(20.0), child: Row( children: [ Expanded( child: Container( - width: MediaQuery.of(context).size.width / 1.3, - padding: EdgeInsets.all(20), - decoration: BoxDecoration( - border: Border.all( - width: 2, - )), - child: Text(_translatedText ?? '')), + width: MediaQuery.of(context).size.width / 1.3, + padding: EdgeInsets.all(20), + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Text(_translatedText ?? ''), + ), ), SizedBox(width: 20), _buildDropdown(true), @@ -86,20 +84,27 @@ class _LanguageTranslatorViewState extends State { ), ), SizedBox(height: 30), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( - onPressed: _translateText, child: Text('Translate')) - ]), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: _translateText, + child: Text('Translate'), + ), + ], + ), SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( - onPressed: _downloadSourceModel, - child: Text('Download Source Model')), + onPressed: _downloadSourceModel, + child: Text('Download Source Model'), + ), ElevatedButton( - onPressed: _downloadTargetModel, - child: Text('Download Target Model')), + onPressed: _downloadTargetModel, + child: Text('Download Target Model'), + ), ], ), SizedBox(height: 20), @@ -107,11 +112,13 @@ class _LanguageTranslatorViewState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( - onPressed: _deleteSourceModel, - child: Text('Delete Source Model')), + onPressed: _deleteSourceModel, + child: Text('Delete Source Model'), + ), ElevatedButton( - onPressed: _deleteTargetModel, - child: Text('Delete Target Model')), + onPressed: _deleteTargetModel, + child: Text('Delete Target Model'), + ), ], ), SizedBox(height: 20), @@ -119,11 +126,13 @@ class _LanguageTranslatorViewState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( - onPressed: _isSourceModelDownloaded, - child: Text('Source Downloaded?')), + onPressed: _isSourceModelDownloaded, + child: Text('Source Downloaded?'), + ), ElevatedButton( - onPressed: _isTargetModelDownloaded, - child: Text('Target Downloaded?')), + onPressed: _isTargetModelDownloaded, + child: Text('Target Downloaded?'), + ), ], ), ], @@ -134,106 +143,111 @@ class _LanguageTranslatorViewState extends State { } Widget _buildDropdown(bool isTarget) => DropdownButton( - value: (isTarget ? _targetLanguage : _sourceLanguage).bcpCode, - icon: const Icon(Icons.arrow_downward), - elevation: 16, - style: const TextStyle(color: Colors.blue), - underline: Container( - height: 2, - color: Colors.blue, - ), - onChanged: (String? code) { - if (code != null) { - final lang = BCP47Code.fromRawValue(code); - if (lang != null) { - setState(() { - isTarget ? _targetLanguage = lang : _sourceLanguage = lang; - _onDeviceTranslator = OnDeviceTranslator( - sourceLanguage: _sourceLanguage, - targetLanguage: _targetLanguage); - }); - } - } - }, - items: TranslateLanguage.values.map>((lang) { - return DropdownMenuItem( - value: lang.bcpCode, - child: Text(lang.name), - ); - }).toList(), + value: (isTarget ? _targetLanguage : _sourceLanguage).bcpCode, + icon: const Icon(Icons.arrow_downward), + elevation: 16, + style: const TextStyle(color: Colors.blue), + underline: Container(height: 2, color: Colors.blue), + onChanged: (String? code) { + if (code != null) { + final lang = BCP47Code.fromRawValue(code); + if (lang != null) { + setState(() { + isTarget ? _targetLanguage = lang : _sourceLanguage = lang; + _onDeviceTranslator = OnDeviceTranslator( + sourceLanguage: _sourceLanguage, + targetLanguage: _targetLanguage, + ); + }); + } + } + }, + items: TranslateLanguage.values.map>((lang) { + return DropdownMenuItem( + value: lang.bcpCode, + child: Text(lang.name), ); + }).toList(), + ); Future _downloadSourceModel() async { Toast().show( - 'Downloading model (${_sourceLanguage.name})...', - _modelManager - .downloadModel(_sourceLanguage.bcpCode) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Downloading model (${_sourceLanguage.name})...', + _modelManager + .downloadModel(_sourceLanguage.bcpCode) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _downloadTargetModel() async { Toast().show( - 'Downloading model (${_targetLanguage.name})...', - _modelManager - .downloadModel(_targetLanguage.bcpCode) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Downloading model (${_targetLanguage.name})...', + _modelManager + .downloadModel(_targetLanguage.bcpCode) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _deleteSourceModel() async { Toast().show( - 'Deleting model (${_sourceLanguage.name})...', - _modelManager - .deleteModel(_sourceLanguage.bcpCode) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Deleting model (${_sourceLanguage.name})...', + _modelManager + .deleteModel(_sourceLanguage.bcpCode) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _deleteTargetModel() async { Toast().show( - 'Deleting model (${_targetLanguage.name})...', - _modelManager - .deleteModel(_targetLanguage.bcpCode) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Deleting model (${_targetLanguage.name})...', + _modelManager + .deleteModel(_targetLanguage.bcpCode) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _isSourceModelDownloaded() async { Toast().show( - 'Checking if model (${_sourceLanguage.name}) is downloaded...', - _modelManager - .isModelDownloaded(_sourceLanguage.bcpCode) - .then((value) => value ? 'downloaded' : 'not downloaded'), - context, - this); + 'Checking if model (${_sourceLanguage.name}) is downloaded...', + _modelManager + .isModelDownloaded(_sourceLanguage.bcpCode) + .then((value) => value ? 'downloaded' : 'not downloaded'), + context, + this, + ); } Future _isTargetModelDownloaded() async { Toast().show( - 'Checking if model (${_targetLanguage.name}) is downloaded...', - _modelManager - .isModelDownloaded(_targetLanguage.bcpCode) - .then((value) => value ? 'downloaded' : 'not downloaded'), - context, - this); + 'Checking if model (${_targetLanguage.name}) is downloaded...', + _modelManager + .isModelDownloaded(_targetLanguage.bcpCode) + .then((value) => value ? 'downloaded' : 'not downloaded'), + context, + this, + ); } Future _translateText() async { FocusScope.of(context).unfocus(); Toast().show( - 'Translating...', - _onDeviceTranslator.translateText(_controller.text).then((result) { - setState(() { - _translatedText = result; - }); - return 'done!'; - }), - context, - this); + 'Translating...', + _onDeviceTranslator.translateText(_controller.text).then((result) { + setState(() { + _translatedText = result; + }); + return 'done!'; + }), + context, + this, + ); } } diff --git a/packages/example/lib/nlp_detector_views/smart_reply_view.dart b/packages/example/lib/nlp_detector_views/smart_reply_view.dart index 58982b11..e707f276 100644 --- a/packages/example/lib/nlp_detector_views/smart_reply_view.dart +++ b/packages/example/lib/nlp_detector_views/smart_reply_view.dart @@ -23,9 +23,7 @@ class _SmartReplyViewState extends State { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - appBar: AppBar( - title: const Text('Smart Reply'), - ), + appBar: AppBar(title: const Text('Smart Reply')), body: GestureDetector( onTap: () { FocusScope.of(context).unfocus(); @@ -40,10 +38,7 @@ class _SmartReplyViewState extends State { padding: const EdgeInsets.symmetric(vertical: 20), child: Container( padding: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( - border: Border.all( - width: 2, - )), + decoration: BoxDecoration(border: Border.all(width: 2)), child: TextField( controller: _localUserController, decoration: InputDecoration(border: InputBorder.none), @@ -53,8 +48,9 @@ class _SmartReplyViewState extends State { ), Center( child: ElevatedButton( - onPressed: () => _addMessage(_localUserController, true), - child: Text('Add message to conversation')), + onPressed: () => _addMessage(_localUserController, true), + child: Text('Add message to conversation'), + ), ), SizedBox(height: 30), Text('Remote User:'), @@ -62,10 +58,7 @@ class _SmartReplyViewState extends State { padding: const EdgeInsets.symmetric(vertical: 20), child: Container( padding: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( - border: Border.all( - width: 2, - )), + decoration: BoxDecoration(border: Border.all(width: 2)), child: TextField( controller: _remoteUserController, decoration: InputDecoration(border: InputBorder.none), @@ -75,27 +68,30 @@ class _SmartReplyViewState extends State { ), Center( child: ElevatedButton( - onPressed: () => - _addMessage(_remoteUserController, false), - child: Text('Add message to conversation')), + onPressed: () => _addMessage(_remoteUserController, false), + child: Text('Add message to conversation'), + ), ), SizedBox(height: 30), Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - if (_smartReply.conversation.isNotEmpty) - ElevatedButton( - onPressed: () { - _smartReply.clearConversation(); - setState(() { - _suggestions = null; - }); - }, - child: Text('Clear conversation')), + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + if (_smartReply.conversation.isNotEmpty) ElevatedButton( - onPressed: _suggestReplies, - child: Text('Get Suggest Replies')), - ]), + onPressed: () { + _smartReply.clearConversation(); + setState(() { + _suggestions = null; + }); + }, + child: Text('Clear conversation'), + ), + ElevatedButton( + onPressed: _suggestReplies, + child: Text('Get Suggest Replies'), + ), + ], + ), SizedBox(height: 30), if (_suggestions != null) Text('Status: ${_suggestions!.status.name}'), @@ -116,17 +112,24 @@ class _SmartReplyViewState extends State { if (controller.text.isNotEmpty) { if (localUser) { _smartReply.addMessageToConversationFromLocalUser( - controller.text, DateTime.now().millisecondsSinceEpoch); + controller.text, + DateTime.now().millisecondsSinceEpoch, + ); } else { _smartReply.addMessageToConversationFromRemoteUser( - controller.text, DateTime.now().millisecondsSinceEpoch, 'userZ'); + controller.text, + DateTime.now().millisecondsSinceEpoch, + 'userZ', + ); } controller.text = ''; ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Message added to the conversation'))); + SnackBar(content: Text('Message added to the conversation')), + ); } else { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text('Message can\'t be empty'))); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Message can\'t be empty'))); } } diff --git a/packages/example/lib/vision_detector_views/camera_view.dart b/packages/example/lib/vision_detector_views/camera_view.dart index dd44226b..04147319 100644 --- a/packages/example/lib/vision_detector_views/camera_view.dart +++ b/packages/example/lib/vision_detector_views/camera_view.dart @@ -6,14 +6,15 @@ import 'package:flutter/services.dart'; import 'package:google_mlkit_commons/google_mlkit_commons.dart'; class CameraView extends StatefulWidget { - CameraView( - {super.key, - required this.customPaint, - required this.onImage, - this.onCameraFeedReady, - this.onDetectorViewModeChanged, - this.onCameraLensDirectionChanged, - this.initialCameraLensDirection = CameraLensDirection.back}); + CameraView({ + super.key, + required this.customPaint, + required this.onImage, + this.onCameraFeedReady, + this.onDetectorViewModeChanged, + this.onCameraLensDirectionChanged, + this.initialCameraLensDirection = CameraLensDirection.back, + }); final CustomPaint? customPaint; final Function(InputImage inputImage) onImage; @@ -82,13 +83,8 @@ class _CameraViewState extends State { children: [ Center( child: _changingCameraLens - ? Center( - child: const Text('Changing camera lens'), - ) - : CameraPreview( - _controller!, - child: widget.customPaint, - ), + ? Center(child: const Text('Changing camera lens')) + : CameraPreview(_controller!, child: widget.customPaint), ), _backButton(), _switchLiveCameraToggle(), @@ -101,120 +97,84 @@ class _CameraViewState extends State { } Widget _backButton() => Positioned( - top: 40, - left: 8, - child: SizedBox( - height: 50.0, - width: 50.0, - child: FloatingActionButton( - heroTag: Object(), - onPressed: () => Navigator.of(context).pop(), - backgroundColor: Colors.black54, - child: Icon( - Icons.arrow_back_ios_outlined, - size: 20, - ), - ), - ), - ); + top: 40, + left: 8, + child: SizedBox( + height: 50.0, + width: 50.0, + child: FloatingActionButton( + heroTag: Object(), + onPressed: () => Navigator.of(context).pop(), + backgroundColor: Colors.black54, + child: Icon(Icons.arrow_back_ios_outlined, size: 20), + ), + ), + ); Widget _detectionViewModeToggle() => Positioned( - bottom: 8, - left: 8, - child: SizedBox( - height: 50.0, - width: 50.0, - child: FloatingActionButton( - heroTag: Object(), - onPressed: widget.onDetectorViewModeChanged, - backgroundColor: Colors.black54, - child: Icon( - Icons.photo_library_outlined, - size: 25, - ), - ), - ), - ); + bottom: 8, + left: 8, + child: SizedBox( + height: 50.0, + width: 50.0, + child: FloatingActionButton( + heroTag: Object(), + onPressed: widget.onDetectorViewModeChanged, + backgroundColor: Colors.black54, + child: Icon(Icons.photo_library_outlined, size: 25), + ), + ), + ); Widget _switchLiveCameraToggle() => Positioned( - bottom: 8, - right: 8, - child: SizedBox( - height: 50.0, - width: 50.0, - child: FloatingActionButton( - heroTag: Object(), - onPressed: _switchLiveCamera, - backgroundColor: Colors.black54, - child: Icon( - Platform.isIOS - ? Icons.flip_camera_ios_outlined - : Icons.flip_camera_android_outlined, - size: 25, - ), - ), + bottom: 8, + right: 8, + child: SizedBox( + height: 50.0, + width: 50.0, + child: FloatingActionButton( + heroTag: Object(), + onPressed: _switchLiveCamera, + backgroundColor: Colors.black54, + child: Icon( + Platform.isIOS + ? Icons.flip_camera_ios_outlined + : Icons.flip_camera_android_outlined, + size: 25, ), - ); + ), + ), + ); Widget _zoomControl() => Positioned( - bottom: 16, - left: 0, - right: 0, - child: Align( - alignment: Alignment.bottomCenter, - child: SizedBox( - width: 250, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Slider( - value: _currentZoomLevel, - min: _minAvailableZoom, - max: _maxAvailableZoom, - activeColor: Colors.white, - inactiveColor: Colors.white30, - onChanged: (value) async { - setState(() { - _currentZoomLevel = value; - }); - await _controller?.setZoomLevel(value); - }, - ), - ), - Container( - width: 50, - decoration: BoxDecoration( - color: Colors.black54, - borderRadius: BorderRadius.circular(10.0), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Center( - child: Text( - '${_currentZoomLevel.toStringAsFixed(1)}x', - style: TextStyle(color: Colors.white), - ), - ), - ), - ), - ], + bottom: 16, + left: 0, + right: 0, + child: Align( + alignment: Alignment.bottomCenter, + child: SizedBox( + width: 250, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Slider( + value: _currentZoomLevel, + min: _minAvailableZoom, + max: _maxAvailableZoom, + activeColor: Colors.white, + inactiveColor: Colors.white30, + onChanged: (value) async { + setState(() { + _currentZoomLevel = value; + }); + await _controller?.setZoomLevel(value); + }, + ), ), - ), - ), - ); - - Widget _exposureControl() => Positioned( - top: 40, - right: 8, - child: ConstrainedBox( - constraints: BoxConstraints( - maxHeight: 250, - ), - child: Column(children: [ Container( - width: 55, + width: 50, decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(10.0), @@ -223,36 +183,66 @@ class _CameraViewState extends State { padding: const EdgeInsets.all(8.0), child: Center( child: Text( - '${_currentExposureOffset.toStringAsFixed(1)}x', + '${_currentZoomLevel.toStringAsFixed(1)}x', style: TextStyle(color: Colors.white), ), ), ), ), - Expanded( - child: RotatedBox( - quarterTurns: 3, - child: SizedBox( - height: 30, - child: Slider( - value: _currentExposureOffset, - min: _minAvailableExposureOffset, - max: _maxAvailableExposureOffset, - activeColor: Colors.white, - inactiveColor: Colors.white30, - onChanged: (value) async { - setState(() { - _currentExposureOffset = value; - }); - await _controller?.setExposureOffset(value); - }, - ), + ], + ), + ), + ), + ); + + Widget _exposureControl() => Positioned( + top: 40, + right: 8, + child: ConstrainedBox( + constraints: BoxConstraints(maxHeight: 250), + child: Column( + children: [ + Container( + width: 55, + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Text( + '${_currentExposureOffset.toStringAsFixed(1)}x', + style: TextStyle(color: Colors.white), ), ), - ) - ]), - ), - ); + ), + ), + Expanded( + child: RotatedBox( + quarterTurns: 3, + child: SizedBox( + height: 30, + child: Slider( + value: _currentExposureOffset, + min: _minAvailableExposureOffset, + max: _maxAvailableExposureOffset, + activeColor: Colors.white, + inactiveColor: Colors.white30, + onChanged: (value) async { + setState(() { + _currentExposureOffset = value; + }); + await _controller?.setExposureOffset(value); + }, + ), + ), + ), + ), + ], + ), + ), + ); Future _startLiveFeed() async { final camera = _cameras[_cameraIndex]; @@ -365,7 +355,7 @@ class _CameraViewState extends State { const androidSupportedFormats = [ InputImageFormat.nv21, InputImageFormat.yv12, - InputImageFormat.yuv_420_888 + InputImageFormat.yuv_420_888, ]; if ((Platform.isAndroid && !androidSupportedFormats.contains(format)) || diff --git a/packages/example/lib/vision_detector_views/detector_view.dart b/packages/example/lib/vision_detector_views/detector_view.dart index 3ade4ffd..1fb34bc0 100644 --- a/packages/example/lib/vision_detector_views/detector_view.dart +++ b/packages/example/lib/vision_detector_views/detector_view.dart @@ -59,7 +59,8 @@ class _DetectorViewState extends State { title: widget.title, text: widget.text, onImage: widget.onImage, - onDetectorViewModeChanged: _onDetectorViewModeChanged); + onDetectorViewModeChanged: _onDetectorViewModeChanged, + ); } void _onDetectorViewModeChanged() { diff --git a/packages/example/lib/vision_detector_views/digital_ink_recognizer_view.dart b/packages/example/lib/vision_detector_views/digital_ink_recognizer_view.dart index 7f34fb00..016345d3 100644 --- a/packages/example/lib/vision_detector_views/digital_ink_recognizer_view.dart +++ b/packages/example/lib/vision_detector_views/digital_ink_recognizer_view.dart @@ -89,15 +89,18 @@ class _DigitalInkViewState extends State { onPanUpdate: (DragUpdateDetails details) { setState(() { final RenderObject? object = context.findRenderObject(); - final localPosition = (object as RenderBox?) - ?.globalToLocal(details.localPosition); + final localPosition = (object as RenderBox?)?.globalToLocal( + details.localPosition, + ); if (localPosition != null) { _points = List.from(_points) - ..add(StrokePoint( - x: localPosition.dx, - y: localPosition.dy, - t: DateTime.now().millisecondsSinceEpoch, - )); + ..add( + StrokePoint( + x: localPosition.dx, + y: localPosition.dy, + t: DateTime.now().millisecondsSinceEpoch, + ), + ); } if (_ink.strokes.isNotEmpty) { _ink.strokes.last.points = _points.toList(); @@ -126,31 +129,24 @@ class _DigitalInkViewState extends State { } Widget _buildDropdown() => DropdownButton( - value: _language, - icon: const Icon(Icons.arrow_downward), - elevation: 16, - style: const TextStyle(color: Colors.blue), - underline: Container( - height: 2, - color: Colors.blue, - ), - onChanged: (String? lang) { - if (lang != null) { - setState(() { - _language = lang; - _digitalInkRecognizer.close(); - _digitalInkRecognizer = - DigitalInkRecognizer(languageCode: _language); - }); - } - }, - items: _languages.map>((lang) { - return DropdownMenuItem( - value: lang, - child: Text(lang), - ); - }).toList(), - ); + value: _language, + icon: const Icon(Icons.arrow_downward), + elevation: 16, + style: const TextStyle(color: Colors.blue), + underline: Container(height: 2, color: Colors.blue), + onChanged: (String? lang) { + if (lang != null) { + setState(() { + _language = lang; + _digitalInkRecognizer.close(); + _digitalInkRecognizer = DigitalInkRecognizer(languageCode: _language); + }); + } + }, + items: _languages.map>((lang) { + return DropdownMenuItem(value: lang, child: Text(lang)); + }).toList(), + ); void _clearPad() { setState(() { @@ -162,41 +158,43 @@ class _DigitalInkViewState extends State { Future _isModelDownloaded() async { Toast().show( - 'Checking if model is downloaded...', - _modelManager - .isModelDownloaded(_language) - .then((value) => value ? 'downloaded' : 'not downloaded'), - context, - this); + 'Checking if model is downloaded...', + _modelManager + .isModelDownloaded(_language) + .then((value) => value ? 'downloaded' : 'not downloaded'), + context, + this, + ); } Future _deleteModel() async { Toast().show( - 'Deleting model...', - _modelManager - .deleteModel(_language) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Deleting model...', + _modelManager + .deleteModel(_language) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _downloadModel() async { Toast().show( - 'Downloading model...', - _modelManager - .downloadModel(_language) - .then((value) => value ? 'success' : 'failed'), - context, - this); + 'Downloading model...', + _modelManager + .downloadModel(_language) + .then((value) => value ? 'success' : 'failed'), + context, + this, + ); } Future _recogniseText() async { showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text('Recognizing'), - ), - barrierDismissible: true); + context: context, + builder: (context) => AlertDialog(title: Text('Recognizing')), + barrierDismissible: true, + ); try { final candidates = await _digitalInkRecognizer.recognize(_ink); _recognizedText = ''; @@ -205,9 +203,9 @@ class _DigitalInkViewState extends State { } setState(() {}); } catch (e) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(e.toString()), - )); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toString()))); } Navigator.pop(context); } @@ -229,8 +227,11 @@ class Signature extends CustomPainter { for (int i = 0; i < stroke.points.length - 1; i++) { final p1 = stroke.points[i]; final p2 = stroke.points[i + 1]; - canvas.drawLine(Offset(p1.x.toDouble(), p1.y.toDouble()), - Offset(p2.x.toDouble(), p2.y.toDouble()), paint); + canvas.drawLine( + Offset(p1.x.toDouble(), p1.y.toDouble()), + Offset(p2.x.toDouble(), p2.y.toDouble()), + paint, + ); } } } diff --git a/packages/example/lib/vision_detector_views/document_scanner_view.dart b/packages/example/lib/vision_detector_views/document_scanner_view.dart index 2fc16694..b55705a1 100644 --- a/packages/example/lib/vision_detector_views/document_scanner_view.dart +++ b/packages/example/lib/vision_detector_views/document_scanner_view.dart @@ -17,10 +17,13 @@ class _DocumentScannerViewState extends State { DocumentScanner? _documentScanner; DocumentScanningResult? _result; static final List menuEntries = UnmodifiableListView( - list.map((String name) => MenuEntry( - value: name, - label: - name == 'Select option' ? name : 'Scan ${name.toUpperCase()}'))); + list.map( + (String name) => MenuEntry( + value: name, + label: name == 'Select option' ? name : 'Scan ${name.toUpperCase()}', + ), + ), + ); @override void dispose() { _documentScanner?.close(); @@ -43,37 +46,39 @@ class _DocumentScannerViewState extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.document_scanner_outlined, - size: 50, - ), + Icon(Icons.document_scanner_outlined, size: 50), SizedBox(width: 8), DropdownMenu( - initialSelection: list.first, - onSelected: (String? value) { - if (value != null) { - if (value == 'pdf') { - startScan({DocumentFormat.pdf}); - } - if (value == 'jpeg') { - startScan({DocumentFormat.jpeg}); - } - if (value == 'pdf-jpeg') { - startScan( - {DocumentFormat.pdf, DocumentFormat.jpeg}); - } + initialSelection: list.first, + onSelected: (String? value) { + if (value != null) { + if (value == 'pdf') { + startScan({DocumentFormat.pdf}); + } + if (value == 'jpeg') { + startScan({DocumentFormat.jpeg}); } - }, - dropdownMenuEntries: menuEntries), + if (value == 'pdf-jpeg') { + startScan({DocumentFormat.pdf, DocumentFormat.jpeg}); + } + } + }, + dropdownMenuEntries: menuEntries, + ), ], ), if (_result?.pdf != null) ...[ Padding( padding: const EdgeInsets.only( - top: 16, bottom: 8, right: 8, left: 8), + top: 16, + bottom: 8, + right: 8, + left: 8, + ), child: Align( - alignment: Alignment.centerLeft, - child: Text('PDF Document:')), + alignment: Alignment.centerLeft, + child: Text('PDF Document:'), + ), ), SizedBox( height: 300, @@ -89,14 +94,20 @@ class _DocumentScannerViewState extends State { if (_result?.images?.isNotEmpty == true) ...[ Padding( padding: const EdgeInsets.only( - top: 16, bottom: 8, right: 8, left: 8), + top: 16, + bottom: 8, + right: 8, + left: 8, + ), child: Align( - alignment: Alignment.centerLeft, - child: Text('Images [0]:')), + alignment: Alignment.centerLeft, + child: Text('Images [0]:'), + ), ), SizedBox( - height: 400, - child: Image.file(File(_result!.images!.first))), + height: 400, + child: Image.file(File(_result!.images!.first)), + ), ], ], ), diff --git a/packages/example/lib/vision_detector_views/face_detector_view.dart b/packages/example/lib/vision_detector_views/face_detector_view.dart index 2580b80d..acb780e7 100644 --- a/packages/example/lib/vision_detector_views/face_detector_view.dart +++ b/packages/example/lib/vision_detector_views/face_detector_view.dart @@ -12,10 +12,7 @@ class FaceDetectorView extends StatefulWidget { class _FaceDetectorViewState extends State { final FaceDetector _faceDetector = FaceDetector( - options: FaceDetectorOptions( - enableContours: true, - enableLandmarks: true, - ), + options: FaceDetectorOptions(enableContours: true, enableLandmarks: true), ); bool _canProcess = true; bool _isBusy = false; diff --git a/packages/example/lib/vision_detector_views/face_mesh_detector_view.dart b/packages/example/lib/vision_detector_views/face_mesh_detector_view.dart index 428ce7b0..a2b07239 100644 --- a/packages/example/lib/vision_detector_views/face_mesh_detector_view.dart +++ b/packages/example/lib/vision_detector_views/face_mesh_detector_view.dart @@ -13,8 +13,9 @@ class FaceMeshDetectorView extends StatefulWidget { } class _FaceMeshDetectorViewState extends State { - final FaceMeshDetector _meshDetector = - FaceMeshDetector(option: FaceMeshDetectorOptions.faceMesh); + final FaceMeshDetector _meshDetector = FaceMeshDetector( + option: FaceMeshDetectorOptions.faceMesh, + ); bool _canProcess = true; bool _isBusy = false; CustomPaint? _customPaint; @@ -34,10 +35,11 @@ class _FaceMeshDetectorViewState extends State { return Scaffold( appBar: AppBar(title: Text('Under construction')), body: Center( - child: Text( - 'Not implemented yet for iOS :(\nTry Android', - textAlign: TextAlign.center, - )), + child: Text( + 'Not implemented yet for iOS :(\nTry Android', + textAlign: TextAlign.center, + ), + ), ); } return DetectorView( diff --git a/packages/example/lib/vision_detector_views/gallery_view.dart b/packages/example/lib/vision_detector_views/gallery_view.dart index b751268d..a43221cd 100644 --- a/packages/example/lib/vision_detector_views/gallery_view.dart +++ b/packages/example/lib/vision_detector_views/gallery_view.dart @@ -8,12 +8,13 @@ import 'package:image_picker/image_picker.dart'; import 'utils.dart'; class GalleryView extends StatefulWidget { - GalleryView( - {super.key, - required this.title, - this.text, - required this.onImage, - required this.onDetectorViewModeChanged}); + GalleryView({ + super.key, + required this.title, + this.text, + required this.onImage, + required this.onDetectorViewModeChanged, + }); final String title; final String? text; @@ -39,68 +40,68 @@ class _GalleryViewState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - actions: [ - Padding( - padding: EdgeInsets.only(right: 20.0), - child: GestureDetector( - onTap: widget.onDetectorViewModeChanged, - child: Icon( - Platform.isIOS ? Icons.camera_alt_outlined : Icons.camera, - ), + appBar: AppBar( + title: Text(widget.title), + actions: [ + Padding( + padding: EdgeInsets.only(right: 20.0), + child: GestureDetector( + onTap: widget.onDetectorViewModeChanged, + child: Icon( + Platform.isIOS ? Icons.camera_alt_outlined : Icons.camera, ), ), - ], - ), - body: _galleryBody()); + ), + ], + ), + body: _galleryBody(), + ); } Widget _galleryBody() { - return ListView(shrinkWrap: true, children: [ - _image != null - ? SizedBox( - height: 400, - width: 400, - child: Stack( - fit: StackFit.expand, - children: [ - Image.file(_image!), - ], - ), - ) - : Icon( - Icons.image, - size: 200, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: ElevatedButton( - onPressed: _getImageAsset, - child: Text('From Assets'), - ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: ElevatedButton( - child: Text('From Gallery'), - onPressed: () => _getImage(ImageSource.gallery), + return ListView( + shrinkWrap: true, + children: [ + _image != null + ? SizedBox( + height: 400, + width: 400, + child: Stack( + fit: StackFit.expand, + children: [Image.file(_image!)], + ), + ) + : Icon(Icons.image, size: 200), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: ElevatedButton( + onPressed: _getImageAsset, + child: Text('From Assets'), + ), ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: ElevatedButton( - child: Text('Take a picture'), - onPressed: () => _getImage(ImageSource.camera), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: ElevatedButton( + child: Text('From Gallery'), + onPressed: () => _getImage(ImageSource.gallery), + ), ), - ), - if (_image != null) Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - '${_path == null ? '' : 'Image path: $_path'}\n\n${widget.text ?? ''}'), + padding: EdgeInsets.symmetric(horizontal: 16), + child: ElevatedButton( + child: Text('Take a picture'), + onPressed: () => _getImage(ImageSource.camera), + ), ), - ]); + if (_image != null) + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + '${_path == null ? '' : 'Image path: $_path'}\n\n${widget.text ?? ''}', + ), + ), + ], + ); } Future _getImage(ImageSource source) async { @@ -119,57 +120,60 @@ class _GalleryViewState extends State { final List assets = assetManifest .listAssets() .where((String key) => key.contains('images/')) - .where((String key) => - key.contains('.jpg') || - key.contains('.jpeg') || - key.contains('.png') || - key.contains('.webp')) + .where( + (String key) => + key.contains('.jpg') || + key.contains('.jpeg') || + key.contains('.png') || + key.contains('.webp'), + ) .toList(); showDialog( - context: context, - builder: (BuildContext context) { - return Dialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30.0)), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Select image', - style: TextStyle(fontSize: 20), + context: context, + builder: (BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Select image', style: TextStyle(fontSize: 20)), + ConstrainedBox( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.7, ), - ConstrainedBox( - constraints: BoxConstraints( - maxHeight: MediaQuery.of(context).size.height * 0.7), - child: SingleChildScrollView( - child: Column( - children: [ - for (final path in assets) - GestureDetector( - onTap: () async { - Navigator.of(context).pop(); - _processFile(await getAssetPath(path)); - }, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset(path), - ), + child: SingleChildScrollView( + child: Column( + children: [ + for (final path in assets) + GestureDetector( + onTap: () async { + Navigator.of(context).pop(); + _processFile(await getAssetPath(path)); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset(path), ), - ], - ), + ), + ], ), ), - ElevatedButton( - onPressed: () => Navigator.of(context).pop(), - child: Text('Cancel')), - ], - ), + ), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + child: Text('Cancel'), + ), + ], ), - ); - }); + ), + ); + }, + ); } Future _processFile(String path) async { diff --git a/packages/example/lib/vision_detector_views/label_detector_view.dart b/packages/example/lib/vision_detector_views/label_detector_view.dart index 04a3427b..41f2d7d8 100644 --- a/packages/example/lib/vision_detector_views/label_detector_view.dart +++ b/packages/example/lib/vision_detector_views/label_detector_view.dart @@ -82,7 +82,8 @@ class _ImageLabelViewState extends State { } else { String text = 'Labels found: ${labels.length}\n\n'; for (final label in labels) { - text += 'Label: ${label.label}, ' + text += + 'Label: ${label.label}, ' 'Confidence: ${label.confidence.toStringAsFixed(2)}\n\n'; } _text = text; diff --git a/packages/example/lib/vision_detector_views/object_detector_view.dart b/packages/example/lib/vision_detector_views/object_detector_view.dart index 64f0e17f..8319b5bf 100644 --- a/packages/example/lib/vision_detector_views/object_detector_view.dart +++ b/packages/example/lib/vision_detector_views/object_detector_view.dart @@ -26,17 +26,17 @@ class _ObjectDetectorView extends State { 'fruits': 'object_labeler_fruits.tflite', 'flowers': 'object_labeler_flowers.tflite', 'birds': 'lite-model_aiy_vision_classifier_birds_V1_3.tflite', - // https://tfhub.dev/google/lite-model/aiy/vision/classifier/birds_V1/3 + // https://tfhub.dev/google/lite-model/aiy/vision/classifier/birds_V1/3 'food': 'lite-model_aiy_vision_classifier_food_V1_1.tflite', - // https://tfhub.dev/google/lite-model/aiy/vision/classifier/food_V1/1 + // https://tfhub.dev/google/lite-model/aiy/vision/classifier/food_V1/1 'plants': 'lite-model_aiy_vision_classifier_plants_V1_3.tflite', - // https://tfhub.dev/google/lite-model/aiy/vision/classifier/plants_V1/3 + // https://tfhub.dev/google/lite-model/aiy/vision/classifier/plants_V1/3 'mushrooms': 'lite-model_models_mushroom-identification_v1_1.tflite', - // https://tfhub.dev/bohemian-visual-recognition-alliance/lite-model/models/mushroom-identification_v1/1 + // https://tfhub.dev/bohemian-visual-recognition-alliance/lite-model/models/mushroom-identification_v1/1 'landmarks': 'lite-model_on_device_vision_classifier_landmarks_classifier_north_america_V1_1.tflite', // https://tfhub.dev/google/lite-model/on_device_vision/classifier/landmarks_classifier_north_america_V1/1 @@ -52,19 +52,21 @@ class _ObjectDetectorView extends State { @override Widget build(BuildContext context) { return Scaffold( - body: Stack(children: [ - DetectorView( - title: 'Object Detector', - customPaint: _customPaint, - text: _text, - onImage: _processImage, - initialCameraLensDirection: _cameraLensDirection, - onCameraLensDirectionChanged: (value) => _cameraLensDirection = value, - onCameraFeedReady: _initializeDetector, - initialDetectionMode: DetectorViewMode.values[_mode.index], - onDetectorViewModeChanged: _onScreenModeChanged, - ), - Positioned( + body: Stack( + children: [ + DetectorView( + title: 'Object Detector', + customPaint: _customPaint, + text: _text, + onImage: _processImage, + initialCameraLensDirection: _cameraLensDirection, + onCameraLensDirectionChanged: (value) => + _cameraLensDirection = value, + onCameraFeedReady: _initializeDetector, + initialDetectionMode: DetectorViewMode.values[_mode.index], + onDetectorViewModeChanged: _onScreenModeChanged, + ), + Positioned( top: 30, left: 100, right: 100, @@ -72,46 +74,47 @@ class _ObjectDetectorView extends State { children: [ Spacer(), Container( - decoration: BoxDecoration( - color: Colors.black54, - borderRadius: BorderRadius.circular(10.0), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: _buildDropdown(), - )), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: _buildDropdown(), + ), + ), Spacer(), ], - )), - ]), + ), + ), + ], + ), ); } Widget _buildDropdown() => DropdownButton( - value: _option, - icon: const Icon(Icons.arrow_downward), - elevation: 16, - style: const TextStyle(color: Colors.blue), - underline: Container( - height: 2, - color: Colors.blue, - ), - onChanged: (int? option) { - if (option != null) { - setState(() { - _option = option; - _initializeDetector(); - }); - } - }, - items: List.generate(_options.length, (i) => i) - .map>((option) { + value: _option, + icon: const Icon(Icons.arrow_downward), + elevation: 16, + style: const TextStyle(color: Colors.blue), + underline: Container(height: 2, color: Colors.blue), + onChanged: (int? option) { + if (option != null) { + setState(() { + _option = option; + _initializeDetector(); + }); + } + }, + items: List.generate(_options.length, (i) => i) + .map>((option) { return DropdownMenuItem( value: option, child: Text(_options.keys.toList()[option]), ); - }).toList(), - ); + }) + .toList(), + ); void _onScreenModeChanged(DetectorViewMode mode) { switch (mode) { diff --git a/packages/example/lib/vision_detector_views/painters/barcode_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/barcode_detector_painter.dart index 7cc1e513..c417e11d 100644 --- a/packages/example/lib/vision_detector_views/painters/barcode_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/barcode_detector_painter.dart @@ -33,12 +33,14 @@ class BarcodeDetectorPainter extends CustomPainter { for (final Barcode barcode in barcodes) { final ParagraphBuilder builder = ParagraphBuilder( ParagraphStyle( - textAlign: TextAlign.left, - fontSize: 16, - textDirection: TextDirection.ltr), + textAlign: TextAlign.left, + fontSize: 16, + textDirection: TextDirection.ltr, + ), ); builder.pushStyle( - ui.TextStyle(color: Colors.lightGreenAccent, background: background)); + ui.TextStyle(color: Colors.lightGreenAccent, background: background), + ); builder.addText('${barcode.displayValue}'); builder.pop(); @@ -103,15 +105,13 @@ class BarcodeDetectorPainter extends CustomPainter { canvas.drawParagraph( builder.build() - ..layout(ParagraphConstraints( - width: (right - left).abs(), - )), + ..layout(ParagraphConstraints(width: (right - left).abs())), Offset( - Platform.isAndroid && - cameraLensDirection == CameraLensDirection.front - ? right - : left, - top), + Platform.isAndroid && cameraLensDirection == CameraLensDirection.front + ? right + : left, + top, + ), ); } } diff --git a/packages/example/lib/vision_detector_views/painters/face_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/face_detector_painter.dart index db787831..ab015125 100644 --- a/packages/example/lib/vision_detector_views/painters/face_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/face_detector_painter.dart @@ -60,60 +60,59 @@ class FaceDetectorPainter extends CustomPainter { cameraLensDirection, ); - canvas.drawRect( - Rect.fromLTRB(left, top, right, bottom), - paint1, - ); + canvas.drawRect(Rect.fromLTRB(left, top, right, bottom), paint1); void paintContour(FaceContourType type) { final contour = face.contours[type]; if (contour?.points != null) { for (final Point point in contour!.points) { canvas.drawCircle( - Offset( - translateX( - point.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ), - translateY( - point.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ), - ), - 1, - paint1); - } - } - } - - void paintLandmark(FaceLandmarkType type) { - final landmark = face.landmarks[type]; - if (landmark?.position != null) { - canvas.drawCircle( Offset( translateX( - landmark!.position.x.toDouble(), + point.x.toDouble(), size, imageSize, rotation, cameraLensDirection, ), translateY( - landmark.position.y.toDouble(), + point.y.toDouble(), size, imageSize, rotation, cameraLensDirection, ), ), - 2, - paint2); + 1, + paint1, + ); + } + } + } + + void paintLandmark(FaceLandmarkType type) { + final landmark = face.landmarks[type]; + if (landmark?.position != null) { + canvas.drawCircle( + Offset( + translateX( + landmark!.position.x.toDouble(), + size, + imageSize, + rotation, + cameraLensDirection, + ), + translateY( + landmark.position.y.toDouble(), + size, + imageSize, + rotation, + cameraLensDirection, + ), + ), + 2, + paint2, + ); } } diff --git a/packages/example/lib/vision_detector_views/painters/face_mesh_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/face_mesh_detector_painter.dart index 92a37aa6..de8c9184 100644 --- a/packages/example/lib/vision_detector_views/painters/face_mesh_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/face_mesh_detector_painter.dart @@ -60,10 +60,7 @@ class FaceMeshDetectorPainter extends CustomPainter { cameraLensDirection, ); - canvas.drawRect( - Rect.fromLTRB(left, top, right, bottom), - paint1, - ); + canvas.drawRect(Rect.fromLTRB(left, top, right, bottom), paint1); void paintTriangle(FaceMeshTriangle triangle) { final List cornerPoints = []; diff --git a/packages/example/lib/vision_detector_views/painters/label_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/label_detector_painter.dart index 8a3d5794..b4472b5c 100644 --- a/packages/example/lib/vision_detector_views/painters/label_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/label_detector_painter.dart @@ -12,23 +12,23 @@ class LabelDetectorPainter extends CustomPainter { void paint(Canvas canvas, Size size) { final ui.ParagraphBuilder builder = ui.ParagraphBuilder( ui.ParagraphStyle( - textAlign: TextAlign.left, - fontSize: 23, - textDirection: TextDirection.ltr), + textAlign: TextAlign.left, + fontSize: 23, + textDirection: TextDirection.ltr, + ), ); builder.pushStyle(ui.TextStyle(color: Colors.lightBlue[900])); for (final ImageLabel label in labels) { - builder.addText('Label: ${label.label}, ' - 'Confidence: ${label.confidence.toStringAsFixed(2)}\n'); + builder.addText( + 'Label: ${label.label}, ' + 'Confidence: ${label.confidence.toStringAsFixed(2)}\n', + ); } builder.pop(); canvas.drawParagraph( - builder.build() - ..layout(ui.ParagraphConstraints( - width: size.width, - )), + builder.build()..layout(ui.ParagraphConstraints(width: size.width)), const Offset(0, 0), ); } diff --git a/packages/example/lib/vision_detector_views/painters/object_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/object_detector_painter.dart index 32ab3053..833f6ac8 100644 --- a/packages/example/lib/vision_detector_views/painters/object_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/object_detector_painter.dart @@ -33,15 +33,18 @@ class ObjectDetectorPainter extends CustomPainter { for (final DetectedObject detectedObject in _objects) { final ParagraphBuilder builder = ParagraphBuilder( ParagraphStyle( - textAlign: TextAlign.left, - fontSize: 16, - textDirection: TextDirection.ltr), + textAlign: TextAlign.left, + fontSize: 16, + textDirection: TextDirection.ltr, + ), ); builder.pushStyle( - ui.TextStyle(color: Colors.lightGreenAccent, background: background)); + ui.TextStyle(color: Colors.lightGreenAccent, background: background), + ); if (detectedObject.labels.isNotEmpty) { - final label = detectedObject.labels - .reduce((a, b) => a.confidence > b.confidence ? a : b); + final label = detectedObject.labels.reduce( + (a, b) => a.confidence > b.confidence ? a : b, + ); builder.addText('${label.text} ${label.confidence}\n'); } builder.pop(); @@ -75,22 +78,17 @@ class ObjectDetectorPainter extends CustomPainter { cameraLensDirection, ); - canvas.drawRect( - Rect.fromLTRB(left, top, right, bottom), - paint, - ); + canvas.drawRect(Rect.fromLTRB(left, top, right, bottom), paint); canvas.drawParagraph( builder.build() - ..layout(ParagraphConstraints( - width: (right - left).abs(), - )), + ..layout(ParagraphConstraints(width: (right - left).abs())), Offset( - Platform.isAndroid && - cameraLensDirection == CameraLensDirection.front - ? right - : left, - top), + Platform.isAndroid && cameraLensDirection == CameraLensDirection.front + ? right + : left, + top, + ), ); } } diff --git a/packages/example/lib/vision_detector_views/painters/pose_painter.dart b/packages/example/lib/vision_detector_views/painters/pose_painter.dart index 3db3049c..08e7b8ec 100644 --- a/packages/example/lib/vision_detector_views/painters/pose_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/pose_painter.dart @@ -37,88 +37,122 @@ class PosePainter extends CustomPainter { for (final pose in poses) { pose.landmarks.forEach((_, landmark) { canvas.drawCircle( - Offset( - translateX( - landmark.x, - size, - imageSize, - rotation, - cameraLensDirection, - ), - translateY( - landmark.y, - size, - imageSize, - rotation, - cameraLensDirection, - ), + Offset( + translateX( + landmark.x, + size, + imageSize, + rotation, + cameraLensDirection, ), - 1, - paint); + translateY( + landmark.y, + size, + imageSize, + rotation, + cameraLensDirection, + ), + ), + 1, + paint, + ); }); void paintLine( - PoseLandmarkType type1, PoseLandmarkType type2, Paint paintType) { + PoseLandmarkType type1, + PoseLandmarkType type2, + Paint paintType, + ) { final PoseLandmark joint1 = pose.landmarks[type1]!; final PoseLandmark joint2 = pose.landmarks[type2]!; canvas.drawLine( - Offset( - translateX( - joint1.x, - size, - imageSize, - rotation, - cameraLensDirection, - ), - translateY( - joint1.y, - size, - imageSize, - rotation, - cameraLensDirection, - )), - Offset( - translateX( - joint2.x, - size, - imageSize, - rotation, - cameraLensDirection, - ), - translateY( - joint2.y, - size, - imageSize, - rotation, - cameraLensDirection, - )), - paintType); + Offset( + translateX( + joint1.x, + size, + imageSize, + rotation, + cameraLensDirection, + ), + translateY( + joint1.y, + size, + imageSize, + rotation, + cameraLensDirection, + ), + ), + Offset( + translateX( + joint2.x, + size, + imageSize, + rotation, + cameraLensDirection, + ), + translateY( + joint2.y, + size, + imageSize, + rotation, + cameraLensDirection, + ), + ), + paintType, + ); } //Draw arms paintLine( - PoseLandmarkType.leftShoulder, PoseLandmarkType.leftElbow, leftPaint); + PoseLandmarkType.leftShoulder, + PoseLandmarkType.leftElbow, + leftPaint, + ); + paintLine( + PoseLandmarkType.leftElbow, + PoseLandmarkType.leftWrist, + leftPaint, + ); paintLine( - PoseLandmarkType.leftElbow, PoseLandmarkType.leftWrist, leftPaint); - paintLine(PoseLandmarkType.rightShoulder, PoseLandmarkType.rightElbow, - rightPaint); + PoseLandmarkType.rightShoulder, + PoseLandmarkType.rightElbow, + rightPaint, + ); paintLine( - PoseLandmarkType.rightElbow, PoseLandmarkType.rightWrist, rightPaint); + PoseLandmarkType.rightElbow, + PoseLandmarkType.rightWrist, + rightPaint, + ); //Draw Body paintLine( - PoseLandmarkType.leftShoulder, PoseLandmarkType.leftHip, leftPaint); - paintLine(PoseLandmarkType.rightShoulder, PoseLandmarkType.rightHip, - rightPaint); + PoseLandmarkType.leftShoulder, + PoseLandmarkType.leftHip, + leftPaint, + ); + paintLine( + PoseLandmarkType.rightShoulder, + PoseLandmarkType.rightHip, + rightPaint, + ); //Draw legs paintLine(PoseLandmarkType.leftHip, PoseLandmarkType.leftKnee, leftPaint); paintLine( - PoseLandmarkType.leftKnee, PoseLandmarkType.leftAnkle, leftPaint); + PoseLandmarkType.leftKnee, + PoseLandmarkType.leftAnkle, + leftPaint, + ); paintLine( - PoseLandmarkType.rightHip, PoseLandmarkType.rightKnee, rightPaint); + PoseLandmarkType.rightHip, + PoseLandmarkType.rightKnee, + rightPaint, + ); paintLine( - PoseLandmarkType.rightKnee, PoseLandmarkType.rightAnkle, rightPaint); + PoseLandmarkType.rightKnee, + PoseLandmarkType.rightAnkle, + rightPaint, + ); } } diff --git a/packages/example/lib/vision_detector_views/painters/subject_segmentation_painter.dart b/packages/example/lib/vision_detector_views/painters/subject_segmentation_painter.dart index e3943eb0..176d1ac1 100644 --- a/packages/example/lib/vision_detector_views/painters/subject_segmentation_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/subject_segmentation_painter.dart @@ -36,20 +36,20 @@ class SubjectSegmentationPainter extends CustomPainter { final int absoluteY = startY; final int tx = translateX( - absoluteX.toDouble(), - size, - Size(imageSize.width.toDouble(), imageSize.height.toDouble()), - rotation, - cameraLensDirection) - .round(); + absoluteX.toDouble(), + size, + Size(imageSize.width.toDouble(), imageSize.height.toDouble()), + rotation, + cameraLensDirection, + ).round(); final int ty = translateY( - absoluteY.toDouble(), - size, - Size(imageSize.width.toDouble(), imageSize.height.toDouble()), - rotation, - cameraLensDirection) - .round(); + absoluteY.toDouble(), + size, + Size(imageSize.width.toDouble(), imageSize.height.toDouble()), + rotation, + cameraLensDirection, + ).round(); final double opacity = confidences[(y * subjectWidth) + x] * 0.5; paint.color = color.withAlpha((opacity * 255).round()); diff --git a/packages/example/lib/vision_detector_views/painters/text_detector_painter.dart b/packages/example/lib/vision_detector_views/painters/text_detector_painter.dart index 550160e3..c6c6679c 100644 --- a/packages/example/lib/vision_detector_views/painters/text_detector_painter.dart +++ b/packages/example/lib/vision_detector_views/painters/text_detector_painter.dart @@ -33,12 +33,14 @@ class TextRecognizerPainter extends CustomPainter { for (final textBlock in recognizedText.blocks) { final ParagraphBuilder builder = ParagraphBuilder( ParagraphStyle( - textAlign: TextAlign.left, - fontSize: 16, - textDirection: TextDirection.ltr), + textAlign: TextAlign.left, + fontSize: 16, + textDirection: TextDirection.ltr, + ), ); builder.pushStyle( - ui.TextStyle(color: Colors.lightGreenAccent, background: background)); + ui.TextStyle(color: Colors.lightGreenAccent, background: background), + ); builder.addText(textBlock.text); builder.pop(); @@ -112,7 +114,8 @@ class TextRecognizerPainter extends CustomPainter { rotation, cameraLensDirection, ); - y = size.height - + y = + size.height - translateY( point.x.toDouble(), size, @@ -133,7 +136,8 @@ class TextRecognizerPainter extends CustomPainter { y = size.height - y; break; case InputImageRotation.rotation90deg: - x = size.width - + x = + size.width - translateX( point.y.toDouble(), size, @@ -165,15 +169,13 @@ class TextRecognizerPainter extends CustomPainter { canvas.drawParagraph( builder.build() - ..layout(ParagraphConstraints( - width: (right - left).abs(), - )), + ..layout(ParagraphConstraints(width: (right - left).abs())), Offset( - Platform.isAndroid && - cameraLensDirection == CameraLensDirection.front - ? right - : left, - top), + Platform.isAndroid && cameraLensDirection == CameraLensDirection.front + ? right + : left, + top, + ), ); } } diff --git a/packages/example/lib/vision_detector_views/pose_detector_view.dart b/packages/example/lib/vision_detector_views/pose_detector_view.dart index ea5131e6..163b1137 100644 --- a/packages/example/lib/vision_detector_views/pose_detector_view.dart +++ b/packages/example/lib/vision_detector_views/pose_detector_view.dart @@ -12,8 +12,9 @@ class PoseDetectorView extends StatefulWidget { } class _PoseDetectorViewState extends State { - final PoseDetector _poseDetector = - PoseDetector(options: PoseDetectorOptions()); + final PoseDetector _poseDetector = PoseDetector( + options: PoseDetectorOptions(), + ); bool _canProcess = true; bool _isBusy = false; CustomPaint? _customPaint; diff --git a/packages/example/lib/vision_detector_views/subject_segmenter_view.dart b/packages/example/lib/vision_detector_views/subject_segmenter_view.dart index 1e65eb00..c4bbfcbc 100644 --- a/packages/example/lib/vision_detector_views/subject_segmenter_view.dart +++ b/packages/example/lib/vision_detector_views/subject_segmenter_view.dart @@ -53,8 +53,9 @@ class _SubjectSegmenterViewState extends State { setState(() { _text = ''; }); - final SubjectSegmentationResult mask = - await _segmenter.processImage(inputImage); + final SubjectSegmentationResult mask = await _segmenter.processImage( + inputImage, + ); if (inputImage.metadata?.size != null && inputImage.metadata?.rotation != null) { final painter = SubjectSegmentationPainter( diff --git a/packages/example/lib/vision_detector_views/text_detector_view.dart b/packages/example/lib/vision_detector_views/text_detector_view.dart index 0ee9c083..3426444b 100644 --- a/packages/example/lib/vision_detector_views/text_detector_view.dart +++ b/packages/example/lib/vision_detector_views/text_detector_view.dart @@ -29,16 +29,18 @@ class _TextRecognizerViewState extends State { @override Widget build(BuildContext context) { return Scaffold( - body: Stack(children: [ - DetectorView( - title: 'Text Detector', - customPaint: _customPaint, - text: _text, - onImage: _processImage, - initialCameraLensDirection: _cameraLensDirection, - onCameraLensDirectionChanged: (value) => _cameraLensDirection = value, - ), - Positioned( + body: Stack( + children: [ + DetectorView( + title: 'Text Detector', + customPaint: _customPaint, + text: _text, + onImage: _processImage, + initialCameraLensDirection: _cameraLensDirection, + onCameraLensDirectionChanged: (value) => + _cameraLensDirection = value, + ), + Positioned( top: 30, left: 100, right: 100, @@ -46,47 +48,48 @@ class _TextRecognizerViewState extends State { children: [ Spacer(), Container( - decoration: BoxDecoration( - color: Colors.black54, - borderRadius: BorderRadius.circular(10.0), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: _buildDropdown(), - )), + decoration: BoxDecoration( + color: Colors.black54, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: _buildDropdown(), + ), + ), Spacer(), ], - )), - ]), + ), + ), + ], + ), ); } Widget _buildDropdown() => DropdownButton( - value: _script, - icon: const Icon(Icons.arrow_downward), - elevation: 16, - style: const TextStyle(color: Colors.blue), - underline: Container( - height: 2, - color: Colors.blue, - ), - onChanged: (TextRecognitionScript? script) { - if (script != null) { - setState(() { - _script = script; - _textRecognizer.close(); - _textRecognizer = TextRecognizer(script: _script); - }); - } - }, - items: TextRecognitionScript.values - .map>((script) { + value: _script, + icon: const Icon(Icons.arrow_downward), + elevation: 16, + style: const TextStyle(color: Colors.blue), + underline: Container(height: 2, color: Colors.blue), + onChanged: (TextRecognitionScript? script) { + if (script != null) { + setState(() { + _script = script; + _textRecognizer.close(); + _textRecognizer = TextRecognizer(script: _script); + }); + } + }, + items: TextRecognitionScript.values + .map>((script) { return DropdownMenuItem( value: script, child: Text(script.name), ); - }).toList(), - ); + }) + .toList(), + ); Future _processImage(InputImage inputImage) async { if (!_canProcess) return; diff --git a/packages/example/lib/vision_detector_views/text_from_widget_view.dart b/packages/example/lib/vision_detector_views/text_from_widget_view.dart index a401612d..17ae35f0 100644 --- a/packages/example/lib/vision_detector_views/text_from_widget_view.dart +++ b/packages/example/lib/vision_detector_views/text_from_widget_view.dart @@ -28,9 +28,7 @@ class _TextFromWidgetViewState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Text From Widget Example'), - ), + appBar: AppBar(title: const Text('Text From Widget Example')), body: Column( children: [ Expanded( @@ -98,8 +96,9 @@ class _TextFromWidgetViewState extends State { try { // Get the RenderObject from the GlobalKey - final RenderRepaintBoundary? boundary = _widgetKey.currentContext - ?.findRenderObject() as RenderRepaintBoundary?; + final RenderRepaintBoundary? boundary = + _widgetKey.currentContext?.findRenderObject() + as RenderRepaintBoundary?; if (boundary == null) { setState(() { @@ -113,8 +112,9 @@ class _TextFromWidgetViewState extends State { final ui.Image image = await boundary.toImage(pixelRatio: 3.0); // Convert to byte data in raw RGBA format - final ByteData? byteData = - await image.toByteData(format: ui.ImageByteFormat.rawRgba); + final ByteData? byteData = await image.toByteData( + format: ui.ImageByteFormat.rawRgba, + ); if (byteData == null) { setState(() { @@ -134,8 +134,9 @@ class _TextFromWidgetViewState extends State { ); // Process the image with the text recognizer - final RecognizedText recognizedText = - await _textRecognizer.processImage(inputImage); + final RecognizedText recognizedText = await _textRecognizer.processImage( + inputImage, + ); setState(() { _extractedText = recognizedText.text.isNotEmpty diff --git a/packages/example/lib/vision_detector_views/utils.dart b/packages/example/lib/vision_detector_views/utils.dart index 1dc02ed1..467d1397 100644 --- a/packages/example/lib/vision_detector_views/utils.dart +++ b/packages/example/lib/vision_detector_views/utils.dart @@ -10,8 +10,12 @@ Future getAssetPath(String asset) async { final file = File(path); if (!await file.exists()) { final byteData = await rootBundle.load(asset); - await file.writeAsBytes(byteData.buffer - .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); + await file.writeAsBytes( + byteData.buffer.asUint8List( + byteData.offsetInBytes, + byteData.lengthInBytes, + ), + ); } return file.path; }