坑中速记整理! 使用 kotlin 写第一个 ReactNative Android 模块

本文主要是介绍坑中速记整理! 使用 kotlin 写第一个 ReactNative Android 模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

预览
Kotlin 和 Swift, 两大新宠! 借 ReactNative 熟悉下 kotlin 的用法,不料掉坑里面了.昨晚花了大半夜,趁这会儿思路清晰,把涉及到的一些关键信息,迅速整理下.

最佳的使用 Kotlin 快速开始写Android模块的方式

  1. react-native init AwesomeProject 生成的 android 目录,是一个标准的 Android Studio 工程,详见: http://facebook.github.io/react-native/docs/getting-started.html
  2. 直接在 Android Studio 中打开 AwesomeProject/android 目录.
  3. 参考文章 http://facebook.github.io/react-native/docs/native-modules-android.html,先用 java 实现
  4. 顶部菜单 –> code –> Convert Java File to Kotlin File ,自动转换为 kotlin .
package com.awesomeproject.AnExampleReactPackageimport android.widget.Toastimport com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethodimport java.util.HashMap/*** Created by yanfeng on 2017/10/12.*/class ToastModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {override fun getName(): String {return "ToastExample"}override fun getConstants(): Map<String, Any>? {val constants = HashMap<String, Any>()constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT)constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG)return constants}@ReactMethodfun show(message: String, duration: Int) {Toast.makeText(reactApplicationContext, message, duration).show()}companion object {private val DURATION_SHORT_KEY = "SHORT"private val DURATION_LONG_KEY = "LONG"}
}

一些坑中的经验

  • 如果 ReactNative 初始化慢,可以改用淘宝源,后面的 –verbose 参数,主要用来辨别是否卡住.
npm install -g nrm
nrm use taobao
npm install -g react-native-cli --verbose
react-native init AwesomeProject --verboses
  • RN 与已有项目集成的原理是,把已有的 Android 项目复制到 android 文件夹,然后改下配置.

  • 如果没有已有的运行良好的项目,不要尝试用 Android Studio 直接新建项目,因为 Android Studio 的默认 SDK 版本(25.3.1) 和 ReactNative 的SDK版本(23.0.1) 不一致,所以在根据 RN 文档,改配置,会遇到各种问题.如果非要模拟,建议直接基于 AwesomeProject/android 这个项目改.

  • 改淘宝源,可以加快速度,但是每次安装还是需要 20~40 分钟(取决于网络环境等).如果本地再起一个 sinopia ,这样第二次初始化 RN 时,只需要 3 ~ 5 分钟.详见: https://github.com/rlidwka/sinopia

  • 如果遇到 All com.android.support libraries must use the exact same version specification 一类的错误,又必须解决的话,可以尝试查看依赖关系,看到底是哪里在冲突:

命令是:

./gradlew -q dependencies app:dependencies --configuration compile

可能的输出:

+--- com.android.support.constraint:constraint-layout:1.0.0-beta2
|    \--- com.android.support.constraint:constraint-layout-solver:1.0.0-beta2
\--- com.facebook.react:react-native:+ -> 0.20.1+--- com.google.code.findbugs:jsr305:3.0.0+--- com.facebook.stetho:stetho-okhttp:1.2.0|    +--- com.google.code.findbugs:jsr305:2.0.1 -> 3.0.0|    +--- com.facebook.stetho:stetho:1.2.0|    |    +--- com.google.code.findbugs:jsr305:2.0.1 -> 3.0.0|    |    \--- commons-cli:commons-cli:1.2|    \--- com.squareup.okhttp:okhttp:2.2.0 -> 2.5.0|         \--- com.squareup.okio:okio:1.6.0+--- com.squareup.okhttp:okhttp-ws:2.5.0|    \--- com.squareup.okhttp:okhttp:2.5.0 (*)+--- com.facebook.fresco:fresco:0.8.1|    +--- com.facebook.fresco:imagepipeline:0.8.1|    |    +--- com.nineoldandroids:library:2.4.0|    |    +--- com.facebook.fresco:fbcore:0.8.1|    |    +--- com.android.support:support-v4:21.0.3 -> 23.0.1|    |    |    \--- com.android.support:support-annotations:23.0.1|    |    \--- com.parse.bolts:bolts-android:1.1.4|    +--- com.facebook.fresco:fbcore:0.8.1|    \--- com.facebook.fresco:drawee:0.8.1|         +--- com.facebook.fresco:fbcore:0.8.1|         \--- com.android.support:support-v4:21.0.3 -> 23.0.1 (*)+--- org.webkit:android-jsc:r174650+--- com.fasterxml.jackson.core:jackson-core:2.2.3+--- com.squareup.okhttp:okhttp:2.5.0 (*)+--- com.facebook.fresco:imagepipeline-okhttp:0.8.1|    +--- com.squareup.okhttp:okhttp:2.3.0 -> 2.5.0 (*)|    +--- com.facebook.fresco:imagepipeline:0.8.1 (*)|    \--- com.facebook.fresco:fbcore:0.8.1+--- com.squareup.okio:okio:1.6.0+--- com.android.support:recyclerview-v7:23.0.1|    +--- com.android.support:support-v4:23.0.1 (*)|    \--- com.android.support:support-annotations:23.0.1+--- com.facebook.stetho:stetho:1.2.0 (*)\--- com.android.support:appcompat-v7:23.0.1\--- com.android.support:support-v4:23.0.1 (*)(*) - dependencies omitted (listed previously)
  • kotlin,会自动引入库; java,点击提示不存在的类,然后使用 Alt + 回车 也可以快速引入.

  • RN 的文档可能是错的.如果提示方法名总是不对,可以尝试下手动输入,看下提示,可能真的变了.

  • 执行 react-native run-android 可能比在 Android Studio 中运行方便;但是第二次执行原生 Android 代码时, Android Studio Run Build 的速度非常快,是更好的选择.

  • 如果是真机,可能需要:

adb reverse tcp:8081 tcp:8081
  • 遇到诡异的问题时,可以尝试先: clean build

源码参考:

https://github.com/ios122/kotlin-module-sample-for-reactnative

参考文章

  • Init project hangs forever

这篇关于坑中速记整理! 使用 kotlin 写第一个 ReactNative Android 模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/526209

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib