资讯专栏INFORMATION COLUMN

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

Bmob / 2763人阅读

摘要:和两大新宠借熟悉下的用法不料掉坑里面了昨晚花了大半夜趁这会儿思路清晰把涉及到的一些关键信息迅速整理下最佳的使用快速开始写模块的方式生成的目录是一个标准的工程详见直接在中打开目录参考文章先用实现顶部菜单自动转换为一些坑中的

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

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

react-native init AwesomeProject 生成的 android 目录,是一个标准的 Android Studio 工程,详见: http://facebook.github.io/react-native/docs/getting-started.html

直接在 Android Studio 中打开 AwesomeProject/android 目录.

参考文章 http://facebook.github.io/react-native/docs/native-modules-android.html,先用 java 实现

顶部菜单 --> code --> Convert Java File to Kotlin File ,自动转换为 kotlin .

package com.awesomeproject.AnExampleReactPackage

import android.widget.Toast

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod

import 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? {
        val constants = HashMap()
        constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT)
        constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG)
        return constants
    }

    @ReactMethod
    fun 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13958.html

相关文章

  • ReactNative 的 App 中,集成 Bugly 你会遇到的一些

    摘要:对于崩溃的收集,我主要关心两个部分是需要统计到正确的崩溃栈。统计到的崩溃栈要是易于阅读的。最方便的是,你直接点击崩溃栈的代码,会自动打开对应的文件。但是正是因为会在模式下,住我们的崩溃栈,从而会导致无法搜集到对应的崩溃也就无法进行上报。 showImg(https://segmentfault.com/img/remote/1460000011982644?w=900&h=500); ...

    ermaoL 评论0 收藏0
  • 一个Android微博客户端的开发

    摘要:地址最近抽了点时间开发了一个微博系统来练手,踩了不少坑,也积累了一些经验。字段登录后存入,并缓存到登录后自动刷新,旧的自动废弃。 github地址 最近抽了点时间开发了一个Android微博系统来练手,踩了不少坑,也积累了一些经验。 因为之前没有做过和服务器的交互。先用php+mysql+redis构建web后台,通过json格式提供接口,这里踩了Gson泛型的坑,不过我是通过对jso...

    toddmark 评论0 收藏0
  • 一个Android微博客户端的开发

    摘要:地址最近抽了点时间开发了一个微博系统来练手,踩了不少坑,也积累了一些经验。字段登录后存入,并缓存到登录后自动刷新,旧的自动废弃。 github地址 最近抽了点时间开发了一个Android微博系统来练手,踩了不少坑,也积累了一些经验。 因为之前没有做过和服务器的交互。先用php+mysql+redis构建web后台,通过json格式提供接口,这里踩了Gson泛型的坑,不过我是通过对jso...

    CoderStudy 评论0 收藏0
  • 一个Android微博客户端的开发

    摘要:地址最近抽了点时间开发了一个微博系统来练手,踩了不少坑,也积累了一些经验。字段登录后存入,并缓存到登录后自动刷新,旧的自动废弃。 github地址 最近抽了点时间开发了一个Android微博系统来练手,踩了不少坑,也积累了一些经验。 因为之前没有做过和服务器的交互。先用php+mysql+redis构建web后台,通过json格式提供接口,这里踩了Gson泛型的坑,不过我是通过对jso...

    charles_paul 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<