将现有的 Flutter Kotlin 项目转换为 Flutter Java 项目

Posted

技术标签:

【中文标题】将现有的 Flutter Kotlin 项目转换为 Flutter Java 项目【英文标题】:Convert an existing Flutter Kotlin project to Flutter Java project 【发布时间】: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。我从来没有寻找过它,但也许可以选择另一种方式。在“重构”下寻找它 【参考方案1】:

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

    从 android/app/src/main/kotlin -> android/app/src/main/java 移动文件夹 com.example.test_app(你有的任何名称)

    将 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);
     
    
    

    删除以下代码 android/app/build.grandle

    ...
    apply plugin: 'kotlin-android'
    ...
    sourceSets 
        main.java.srcDirs += 'src/main/kotlin'
    
    

    在同一个地方替换以下内容:

    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/

【讨论】:

以上是关于将现有的 Flutter Kotlin 项目转换为 Flutter Java 项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有的 eclipse GWT 项目转换为动态 Web 项目?

将现有的objective-c静态库转换为swift

将现有的 css/html 页面转换为 Django

将现有 Flutter Java Android 项目转换为 Kotlin

将现有的数据库模式转换为星型模式

如何将现有的回调 API 转换为 Promise?