将现有的 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 项目?