【问题标题】:Convert an existing Flutter Kotlin project to Flutter Java project将现有的 Flutter Kotlin 项目转换为 Flutter Java 项目
【发布时间】:2020-02-23 01:27:35
【问题描述】:

我使用默认值创建了一个 Flutter 项目,默认值是用于 Android 的 Kotlin 和用于 iOS 的 Swift。在项目进行到一半时,我需要集成一个需要 Java 的第 3 方 Android SDK。我可以在创建后将 Flutter 项目转换为 Java for Android 吗?

我知道我需要你使用平台通道将本机代码与我的 Flutter 应用程序集成,这不是我关心的问题。

【问题讨论】:

  • Kotlin 可以使用 Java 库。
  • 在 Android Studio 中,您可以将 java 转换为 kotlin。我从来没有寻找过它,但也许可以选择另一种方式。在“重构”下寻找它

标签: java android kotlin flutter


【解决方案1】:

我遇到了同样的问题,对我来说这个解决方案有效。

  1. 从 android/app/src/main/kotlin -> android/app/src/main/java 移动文件夹 com.example.test_app(你有的任何名称)
  2. 将 MainActivity.kt 替换为 Java 版本,或复制到这里

    package com.example.test_app;
    
    import androidx.annotation.NonNull;
    import io.flutter.embedding.android.FlutterActivity;
    import io.flutter.embedding.engine.FlutterEngine;
    import io.flutter.plugins.GeneratedPluginRegistrant;
    
    public class MainActivity extends FlutterActivity {
     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
     GeneratedPluginRegistrant.registerWith(flutterEngine);
     }
    }
    
  3. 删除以下代码 android/app/build.grandle

    ...
    apply plugin: 'kotlin-android'
    ...
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
    
  4. 在同一个地方替换以下内容:

    dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.1.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    }
    

    dependencies {
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }
    

【讨论】:

  • 我已经这样做了,但总是阅读 kotlin 文件Couldn't read file LocalFile: 'xxxx.kt' even though it exists. Please verify that this file has read permission and try again.
  • 就我而言,我已经完成了所有相同的步骤,但我得到了/MainActivity.java:13: error: method does not override or implement a method from a supertype @Override(无法覆盖configureFlutterEngine):(
  • @daveoncode 这些导入对我有用。导入 io.flutter.embedding.android.FlutterActivity;导入 io.flutter.embedding.engine.FlutterEngine;导入 io.flutter.plugins.GeneratedPluginRegistrant;
  • 不要忘记将“test_app”从导入行更改为您的应用名称
【解决方案2】:

默认情况下,flutter 模板支持使用 Kotlin 编写 Android 代码,或使用 Swift 编写 iOS 代码。要使用 Java 或 Objective-C,请使用 -i 和/或 -a 标志:

在终端运行中:flutter create -i objc -a java your_project_name

如果您想更改现有应用平台语言选择,作为一种解决方法,您可以删除 android/ 目录并运行 flutter create -a java为新的语言选择重新创建目录(对于 ios/ 和 Swift 相同)。 不过,您需要重新应用自定义更改。

【讨论】:

  • flutter create -a java没有正常工作,它返回“没有为输出目录指定选项”,我建议大家不要删除android目录,而是重命名它或将它移动到其他地方进行备份.直到您确保新目录创建成功。
  • 您需要指定项目的目录。如果您在目录内,只需添加一个“。”最后:flutter create -a java .
【解决方案3】:

如果你从 cmd 创建一个新项目:

flutter create -i objc -a java project_name

注意:-a 表示 android 标志,-i 表示 ios 标志。如果你只想要java,你可以删除-i objc

如果要转换现有项目:

flutter create -a java .

上一行末尾有一个点,转换现有项目时

【讨论】:

  • 就我而言,我必须添加组织标志--org you-app-package(com.example)
【解决方案4】:

在你的项目目录中运行flutter create -a java .

flutter create:如果在已经存在的项目上运行,这将 修复项目,重新创建所有丢失的文件。

删除android/src/main中的kotlin目录,如果它只包含生成的示例代码

【讨论】:

    【解决方案5】:

    只是想跟进这个,因为我今天不得不将我的 Flutter 项目中的默认语言从 Kotlin 更改为 Java,并且遇到了一个小痛点,我发现在我的项目目录中运行 flutter create -i swift -a java . 有效,但是导致我的项目名称根据它所在的目录而更改,并且如果该目录名称是我的“包名称”的最后一个值(即:com.flutter.app 并且目录是“app”),则此然后在编译时抛出D8: Program type already present: 错误。

    这是由于原始 Kotlin src 的 MainActivity。我发现我必须(在将我的源代码检出到我想在包名称中使用的这个“app”文件夹之后),首先删除这个现有的android/app/src/main/kotlin 文件夹然后运行flutter create -i swift -a java . 命令。

    请注意,我没有向 Kotlin 文件夹添加任何唯一代码,因此无需担心删除此文件夹。

    希望这可以帮助遇到类似问题的其他人。

    【讨论】:

      【解决方案6】:

      以防万一在尝试做this然后this之后,你发现你不能生成java类,建议和导航声明没有出现等等,

      右键单击 java 文件夹,将目录标记为 > 源根目录。然后,通过选择 android 目录打开新的 android studio 窗口来编辑您的 java 类

      参考:Why Android Studio doesn't allow me to create Java Classes?

      【讨论】:

        【解决方案7】:

        我也在使用 Kotlin /Flutter。

        使用最新的 Firebase Flutter 重写,不再需要大多数 kt 文件。切换到 v2 嵌入,使用 Kotlin 也没关系...

        https://firebase.flutter.dev/docs/migration/

        【讨论】:

          猜你喜欢
          • 2021-11-06
          • 2018-08-10
          • 1970-01-01
          • 2023-01-13
          • 2018-08-10
          • 2021-03-15
          • 1970-01-01
          • 2011-01-27
          • 2012-09-21
          相关资源
          最近更新 更多