Flutter - 从现有的Android项目导入

31

我目前正在进行一个Android项目,进度已经完成了约75%。我需要一个类似的iOS应用程序。

我可以将这个项目导入Flutter吗?如何操作?

此外,Flutter是否支持我在该项目中使用的库?


3
如果你有大量的XML文件,我自己写的简单工具可以减少很多手动工作: https://www.unsode.com/home/AndroidXmlToFlutterScaffold - okarpov
5个回答

57
Flutter应用程序的工作方式完全不同,即不像Android也不像iOS。Flutter有自己的架构和插件等。 ,你不能将现有的Android代码转换为Flutter所需的Dart代码,这是实现跨平台行为所必需的,因为Flutter SDK使用的所有代码都必须用Dart编写。 然而,您可以通过将其包含在Android文件夹中并尝试将其与Flutter SDK集成来利用您的Android代码,这可能比完全用Dart重写要多做很多工作。这也不是您通常想要做的,因为本机Android和iOS代码最有意义的用途是使用插件实现无法使用Flutter实现的功能。
还有第三种方法,即保留Android代码,仅使用Flutter添加功能。这更难实现,因为您将不得不创建一个接口从Android代码“切换”到Flutter。使用此方法,您还需要在Flutter或本机iOS中重写其余部分,这对您没有任何帮助。

详细说明

这个问题有一个非常直接的答案。
Flutter是原生SDK之上的一层。这意味着,如果你曾经看过一个Flutter项目,你会发现它目前基本上有三个结构可以使用:
- `lib`文件夹用于Dart代码+Flutter需要的文件(例如包含插件),简称为Flutter的Dart代码。 - `iOS`文件夹用于Objective-C或Swift代码,其中还包括通常的iOS附件。 - `android`文件夹用于Java或Kotlin(或C++)代码和所有其他gradle文件等。
这意味着,如果你想要使用原生代码,你可以使用,但不需要这样做。在开发期间,你可以完全忽略`android`和`ios`文件夹。
最可能的情况是,你只需要修改应用程序图标、名称、版本名称、许可证密钥等方面的内容。
Flutter的目标是在Flutter SDK中只使用Dart编写所有代码,这意味着您现有的Android代码可能会被包含在项目中,但对于iOS没有任何用处,因为所有跨平台工作都是使用Flutter SDK中的Dart完成的。
结论:
如果您真的想切换到Flutter SDK,最好的选择是完全转向Flutter,即使用Dart重写所有功能。
没有“导入”的可能性将Android代码转换为Flutter代码。即使它们是用相同的语言编写的,这也不起作用,因为Flutter架构完全不同,构建应用程序的方式与Android应用程序无关。
如果您认为学习Dart并为跨平台重写您的应用程序不值得,但仍然希望获得iOS支持,我建议您编写iOS本地代码,但我的一般建议是使用Dart重新编写整个应用程序。

很遗憾,但替代方案React Native也是一样的:https://dev59.com/VJ7ha4cB1Zd3GeqPqemC - Gabor

4

Flutter采用一种根本不同的渲染架构。所有的渲染都通过Dart代码计算,而不使用本地元素。

因此,你不仅不能使用本地代码,也无法像“将本地导入Flutter”那样做。

对于库,这是一个复杂的话题。你可以使用它们。但只能在Flutter称之为平台通道中使用。这是一个API,用于编写运行在操作系统本地的代码所做的系统调用。

因此,Firebase等库是可以的。但组件库或类似rxjava的东西都不行。你需要一个类似的Dart库。


0
我认为目前还没有办法。这个原因已经被@creativecreatorormaybenot详细解释过了。 我想补充说,不仅是语言上的差异使得转换变得具有挑战性,而且整个android本地视图和视图层次结构与Flutter的视图层次结构也大不相同。 如果您熟悉Cocos框架,它有自己的视图层次结构,Flutter与其类似,但更好、更丰富,并由Google进行验证( 我猜;) )。 在Flutter中,启动点仍然是常规的android活动,但那只是开始。然后控制流会传递给Flutter来测量和绘制UI小部件。 您可能仍需要使用原生Java/Kotlin android或IOS本机风格实现一些需要系统服务、硬件访问的功能。
建议: 此时此刻,我不会推荐您使用hackish方式将Dart转换为Java/Kotlin和Android UI转换为Flutter UI,即使您在网上看到了一些东西。原因是,Flutter本身是谷歌的一个实验,尚未像Android那样成熟。您应该预期会经常添加或更改一些细微之处。 既然您已经完成75%,我建议您全部使用本机(Android和IOS)或全部使用Flutter。
精确回答您的问题: 我可以将此项目导入Flutter吗? 目前还不行。

另外,Flutter是否支持我在这个项目中使用的库? 有点。 由于您没有提到您使用的任何库,我将举几个例子来使其更清晰: - 图像下载库(glide、picasso)可以被Flutter的本地Image小部件替换。 - 如果您想要将任何核心Java库移植到Flutter中,可以遵循Flutter关于开发包和插件的文档,该文档基本上是在Dart中声明合同/API,并在“android”文件夹中实现Java包。合同对IOS和Android保持不变。 - 如果您想要使用系统级组件,就像我之前提到的那样,包和插件是正确的选择。 这里是Dart团队开发的第一手插件列表。


这就是我所说的“自己的架构”。 - creativecreatorormaybenot
我已经编辑了答案,以便特别考虑问题第二部分的通用性。 - Aleon Q

0

我能把这个项目导入到Flutter中吗?怎么做?

据我目前的研究,Flutter没有提供从其他框架导入项目的选项。Flutter的架构与其他框架完全不同且全新。我们可以将现有的Android代码包含在我们的项目中,但对于iOS来说没有任何用处,因为所有跨平台工作都是使用Flutter SDK中的Dart语言完成的。

Flutter是否支持我在此项目中使用的库?

不支持,因为Flutter提供了自己用Dart编写的库。他们每天都在添加新的库,我们需要使用它们。

因此,我们需要使用Dart语言编写完整的项目,并使用Flutter现有的库构建一个新项目。


这包含在我的答案中。 - creativecreatorormaybenot
1
请考虑接受 @creativecreatorormaybenot 的答案。 - filol

0

从我所看到的,你可能需要大部分将它移植到Dart上。然而,由于你的75%很可能包括不只是编程(例如设计、交互、流程),因此将这些易于重新编码为Dart以完成。


好的,有没有一种简单的方法可以导入现有项目并将其转换为Flutter项目? - Rashiq
我听说在同一个项目中可以有既是Android页面又是Dart页面的页面,但我无法提供更多具体信息。 - Randal Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接