Avatar ·

Ошибка "Module was compiled with an incompatible version of Kotlin": как исправить бинарную несовместимость версий?

Всем привет! Я новичок в разработке под Android и Flutter. Пытаюсь добавить платежный модуль Stripe в свой проект, но при сборке Gradle вылетает ошибка: ``` Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.15 ``` Я использую Flutter 3.0.0, а в файле `android/build.gradle` у меня прописано: ```kotlin ext.kotlin_version = '1.3.50' dependencies { classpath 'com.android.tools.build:gradle:7.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } ``` В `pubspec.yaml` у меня Stripe SDK версии `stripe_payment: ^1.10.0`. Я понимаю, что ошибка связана с несовместимостью Kotlin, но не могу понять, какую именно версию нужно поставить. Пробовал менять `kotlin_version` на 1.5.0, 1.6.0, 1.7.0 — ошибка всё равно появляется. Подскажите, пожалуйста, как правильно синхронизировать версии Kotlin в проекте Flutter с Android? Заранее спасибо! <<>>

Причина ошибки и общее решение

Ошибка возникает из-за несовместимости версий Kotlin между вашим проектом и одной из зависимостей (в вашем случае — Stripe SDK). Сообщение binary version of its metadata is 1.5.1, expected version is 1.1.15 означает, что Stripe скомпилирован с Kotlin 1.5.x, а ваш проект использует более старую версию (1.3.50). Gradle не может загрузить метаданные модуля, потому что формат бинарных данных изменился.

Пошаговое исправление

  1. Обновите Kotlin до актуальной версии. Для Flutter 3.0.0 рекомендуется Kotlin 1.7.0 или выше. Откройте android/build.gradle и измените:
ext.kotlin_version = '1.7.10'
dependencies {
    classpath 'com.android.tools.build:gradle:7.2.0'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
  1. Синхронизируйте версию в android/app/build.gradle. Убедитесь, что в этом файле тоже указана та же версия Kotlin:
android {
    ...
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
  1. Обновите Stripe SDK до последней версии. В pubspec.yaml замените:
dependencies:
  flutter:
    sdk: flutter
  stripe_payment: ^1.15.0  // или новее
  1. Выполните чистую пересборку. В терминале выполните:
flutter clean
flutter pub get
cd android
./gradlew clean
cd ..
flutter run

Почему это работает?

Stripe SDK (начиная с версии 1.10.0) требует Kotlin 1.5.x или новее. Если ваш проект использует старую версию Kotlin, Gradle не может загрузить модуль Stripe, потому что его метаданные скомпилированы в новом формате, который не читается старым плагином. Обновление Kotlin до 1.7.x решает проблему, так как эта версия обратно совместима с 1.5.x.

Дополнительные советы

  • Проверьте другие зависимости. Иногда несколько пакетов могут требовать разные версии Kotlin. Используйте команду flutter pub deps для просмотра дерева зависимостей.
  • Если ошибка осталась, попробуйте удалить папку android/.gradle и повторить сборку.
  • Для Flutter 3.7+ рекомендуется Kotlin 1.8.0 и Gradle 7.6.0.
<<>>

Альтернативный подход: использование Kotlin Gradle DSL

Если вы предпочитаете более современный способ конфигурации, можно перейти с Groovy (.gradle) на Kotlin DSL (.gradle.kts). Это часто помогает избежать проблем с версиями, так как Kotlin DSL автоматически синхронизирует версию Kotlin для Gradle-скриптов.

Пример перехода

Вместо android/build.gradle создайте android/build.gradle.kts:

plugins {
    id("com.android.application") version "7.2.0" apply false
    id("org.jetbrains.kotlin.android") version "1.7.10" apply false
}

В android/app/build.gradle.kts:

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    compileSdk = 33
    defaultConfig {
        minSdk = 21
        targetSdk = 33
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Преимущества

  • Единая версия Kotlin для всего проекта (Gradle-скрипты и код).
  • Лучшая поддержка типов и автодополнения в IDE.
  • Меньше ошибок несовместимости версий.

После перехода обязательно выполните flutter clean и пересборку.