坑中速記整理! 使用 kotlin 寫第一個 ReactNative Android 模塊

来源:http://www.cnblogs.com/ios122/archive/2017/10/12/7658806.html
-Advertisement-
Play Games

Kotlin 和 Swift, 兩大新寵! 借 ReactNative 熟悉下 kotlin 的用法,不料掉坑裡面了.昨晚花了大半夜,趁這會兒思路清晰,把涉及到的一些關鍵信息,迅速整理下. ...


preview

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.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<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
    }

    @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

參考文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ``` <!doctype html vue route demo Hello App! <! 使用 router link 組件來導航. <! 通過傳入 屬性指定鏈接. <! <router link 預設會被渲染成一個 標簽 Go to Foo Go to Bar <! 路由出口 <! 路由匹配 ...
  • //除法函數,用來得到精確的除法結果//說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。//調用:accDiv(arg1,arg2)//返回值:arg1除以arg2的精確結果function accDiv(arg1,arg2){ var ...
  • 這是我學習nodejs以來做的第一個小例子,很簡單,就是在第一個頁面里輸入自己的名字,在第二個頁面(有圖片)中顯示。思路和很多地方都參考了http://www.cnblogs.com/giggle/p/6287931.html 這篇文章,感謝作者。 這篇文章中說得不對的地方希望大家指正。 ...
  • 一:文件傳輸 在android開發中,有時候需要將文件從pc端傳遞至android,或者將軟體運行的日誌,從android設備傳遞到pc進行分析,我們可以使用windows的cmd視窗,或者android studio的terminal視窗來傳遞文件。 1:連接android設備 此處預設是andr ...
  • Activity的生命周期 1.正常情況下的生命周期 Activity的生命周期切換過程 關於onStart和onResume、onPause和onStop的不同,onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否位於前臺 ...
  • 先展示實現的效果圖如下: 此示例展示用的是MVVM結構形式,表述如下 M:數據Model的存儲,可以用來對屬性進行處理。(即胖model概念,上圖中xx萬人訂閱這個處理方法寫在Model內) V: View。用來統一管理控制項初始化與佈局。 VM:viewModel。負責網路請求及其他計算或事件處理 ...
  • 概述 YdbOnline是面向網頁開發者提供的網頁開發工具包。 通過使用YdbOnline,網頁開發者可藉助YdbOnline高效地使用語音、位置等手機系統的能力,同時可以直接使用清除緩存、掃一掃等App特有的能力,為用戶提供更優質的網頁體驗。 此文檔面向網頁開發者介紹YdbOnline如何使用及相 ...
  • ACTION_PACKAGE_ADDED 一個新應用包已經安裝在設備上,數據包括包名(最新安裝的包程式不能接收到這個廣播)ACTION_PACKAGE_REPLACED 一個新版本的應用安裝到設備,替換之前已經存在的版本ACTION_PACKAGE_REMOVED 一個已存在的應用程式包已經從設備上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...