Kotlin + Flutter UI上的iOS和Android应用程序

图片

参赛作品


大家好 前段时间,我决定同时为Android和iOS创建我的项目。 自然地,出现了关于技术选择的问题。 几周后,我查看了流行的堆栈,然后选择了Kotlin / Native。 自从我是一名Android开发人员以来,我就很熟悉Kotlin了很长一段时间,但是对Swift的了解并不多,我想让大多数代码都适用于这两个平台。 因此,这个问题立即出现,但是如何为iOS编写UI。 快速浏览一下市场,发现那里有Flutter,它允许您同时为两个平台编写UI。 实际上,这个故事开始了。

本文介绍Flutter作为UI和Kotlin进行核心逻辑构建的经验。 重要提示:猫下有很多图片和有关如何组装项目的说明

目录



第一部分


在Kotlin上创建共享库


  1. 选择Kotlin Mobile共享库

    图片
  2. 下一个

    图片
  3. 指定我们的工作文件夹,这里我为项目创建了一个单独的文件夹。 由于我将有4个不同的项目,因此将它们放在一个位置更方便

    图片
  4. 仍然需要在sdk.dir中指定sdk.dir的路径, sdk.dir开始构建项目,我的路径是/Users/vlad/Library/Android/sdk

    图片
  5. 项目结构,将包名称从sample habr.example更改sample habr.example

    图片
  6. 是时候开始发布了,调用wrapper 。 之后,.gradlew .gradlew将出现在我们的项目中,并且可以在终端上使用它。

    图片
  7. 从终端./gradlew publishToMavenLocal

    图片
  8. 之后,在本地Maven存储库中,我们将有4个文件夹,这些文件夹将位于我们的库中

    图片

第二部分


创建一个Android应用程序


创建一个Android项目

这里的一切都是标准的。

图片

图片

图片

图片

  1. 在撰写本文时,该项目的生成具有“中断的”依赖关系,因此我们在jre7的末尾将其删除,我们得到koltin-stdlib ,之后该项目开始构建

    图片
  2. 打开build.gradle并将mavenLocal添加mavenLocal repositories部分。 重要! repositories部分应该在allprojects而不是在allprojects

    图片
  3. 现在我们可以将我们的库添加为依赖项
    implementation 'habr.example:commonLibrary-jvm:0.0.1'

    图片
  4. 我们打开activity_main.xml并在main_activity_text TextView ID中指定main_activity_text

    图片
  5. MainActivity.kt只需在此TextView设置文本

    图片
  6. 太好了,至此,我们有了一个可以使用我们库中的hello()函数的Android应用程序
    模拟器上的hello()
    图片

第三部分


创建一个iOS项目


  1. 选择单视图应用

    图片
  2. 填写基本信息,然后选择文件夹。 选择我们其他项目的文件夹根目录很重要,因为Xcode将在其中创建一个带有项目名称的子文件夹。

    图片

    图片
  3. 首先,添加CocoaPods 。 为此,请在项目文件夹中运行pod init ,在Xcode关闭项目Xcode然后运行pod install 。 我们看到安装成功完成

    图片
  4. 重要! CocoaPods不建议将/Pods文件夹添加到.gitignore ,但是我还是这样做了。 由于添加了flutter ,我们将为每个build重新配置依赖项。 到目前为止,我更喜欢这种解决方案,而不是阻塞.git
  5. 通过文件Awesome App.xcworkspace打开项目

    图片
  6. 我们打开终端,在其中转到我们的./gradlew linkDebugFrameworkIos文件夹,然后运行./gradlew linkDebugFrameworkIos 。 之后, iOSFramework出现在我们的build文件夹中iOSFramework

    图片
  7. 选择目标

    图片
  8. 对于这个目标,我们添加二进制

    图片
  9. 选择添加其他

    图片
  10. 指定您在步骤6中收到的framework的路径( commonLibrary.framework

    图片

    图片
  11. 现在在项目中应显示此framework

    图片
  12. 转到Build Settings并禁用Enable Bitcode

    图片
  13. 现在,您需要指定确切的位置来查找我们的framework ,打开“ Framework Search Path

    图片
  14. 指定路径"${PODS_ROOT}/../../commonLibrary" 。 确保选择recursive 。 当然,如果您更准确地配置路径,则可以不这样做。 但是,由于这仅仅是项目的开始,因此对于我们来说确保整个工作都能正常进行很重要。 然后我们可以改变方式

    图片
  15. 我们需要确保在Xcode每个buildXcode我们的framework使用gradle 。 开放Build Phases

    图片
  16. 添加一个新的Script Phase

    图片
  17. 添加脚本代码。

     cd "${PODS_ROOT}/../../commonLibrary" echo $(pwd) ./gradlew linkIos 

    在这里,我们只需转到库的项目文件夹并运行./gradlew linkIos 。 仅在控制台中需要显示echo $(pwd)调用,才能显示我们到哪个特定文件夹

    图片
  18. target dependencies之后,我们将build phase推到了最顶层

    图片
  19. 现在打开ViewController并从库中添加对我们函数的调用

    图片
  20. 我们启动我们的项目,看看

    图片

太好了,这意味着我们已将Kotlin库正确连接到iOS项目。
剩下的就是在我们的应用程序中添加颤动(作为编写UI的框架),然后您就可以开始开发产品了

第4部分


将Flutter添加到Android应用


然后在github上的一篇文章对我有很大帮助

  1. 转到我们所有项目所在的根文件夹,然后执行flutter create -t module flutter_ui

    图片
  2. 打开settings.gradle并将flutter-module启用为子项目

    图片
  3. 打开build.gradle文件并添加我们的项目,具体取决于

    图片
  4. MainActivity.ktFlutterActivity

    图片
  5. 添加App.kt ,在其中我们将在应用程序启动时初始化Flutter

    图片
  6. 更改清单并说我们现在有一个Application

    图片
  7. 确保添加java8 ,否则将无法启动

    图片
  8. 我们在JVM日志的Hello中看到了UI,这意味着我们将UI放在Flutter上,并将主库放在Kotlin / Native上



    图片
  9. MainActivity.kt中添加一个方法,我们将从Flutter中调用该方法。 在这里,在Flutter的事件中,我们从kotlin-library返回了hello()

    图片
  10. 并将代码添加到main.dart ,该代码将iOS/Android-应用程序的iOS/Android-调用该方法

    图片
  11. 我们得到


第5部分


将Flutter添加到iOS App


  1. 更新我们的Podfile
     flutter_application_path = File.expand_path("../flutter_ui", File.dirname(path)) eval(File.read( File.join( flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding) 

    图片

    图片
  2. 这很重要 。 将$(inherited)添加到framework search paths的第一行。 确保检查framework search paths

    图片

    当您在some/path/my_flutter/pubspec.yaml更改依赖some/path/my_flutter/pubspec.yaml ,您需要运行从some/path/my_flutter flutter packages get以更新some/path/my_flutter中的依赖podhelper.rb 。 之后,从some/path/MyApp运行pod install
  3. 仅针对Flutter增加1个Build Phase Script phase 第3部分中添加的内容之上

     "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed 

    图片
  4. FlutterAppDelegate AppDelegate我们的AppDelegate

    图片
  5. 更新ViewController

    图片
  6. ViewController包裹在NavigatorController

    图片
  7. 现在,应用程序启动。 但是,到目前为止,我们在库和颤振之间没有任何联系
  8. 使用FlutterMethodChannel添加此链接

    图片
  9. 太好了,现在iOS应用程序将flutter用于UI ,将kotlin用于主要逻辑。



结论


这里要说的很重要:我不假装您已经学到了新的东西或独特的东西。 我只是分享了我的经验,因为为了使所有这些协同工作,我花了大约4个工作日。 而且我找不到同时使用Kotlin / Native和Flutter的项目代码示例

最终项目

  1. 项目组
  2. flutter-ui
  3. ios
  4. 安卓
  5. 普通图书馆

链接列表对我有帮助,但不是立即

  1. 自己扑
  2. 本机代码与UI Flutter平台通道之间的关系
  3. Flutter添加到现有的github应用中
  4. Kotlin Native 本机概述

Source: https://habr.com/ru/post/zh-CN437176/


All Articles