在 react-native 的源碼里面,有一個 UIExplorer 的DEMO,提供了內置控件的各種演示,可以很方便的讓我們了解到當前 react-native 的一些功能支持情況。
ReactNativeHost的兼容性
在最新的代碼里面,通過執(zhí)行?
./gradlew :Examples:UIExplorer:android:app:installDebug
肯能無法編譯通過,是因為在 49f20f4 的改動里面?getBundleAssetName, getJSBundleFile, getJSMainModuleName, getUseDeveloperSupport, getPackages 這幾個 API 已經從 ReactActivity.java 里面移除了,所以在 UIExplorerActivity.java 里面繼續(xù)留著 @Override 是存在編譯錯誤的。
針對這個問題,如果需要在最新的代碼里面編譯,運行 UIExplorer,需要對 UIExplorerActivity.java 進行一些改動,主要是在 onCreate() 里面初始化一個 ReactNativeHost 的實例,如下:
mReactNativeHost=newReactNativeHost(this.getApplication()) {
? @Override
? publicString getJSMainModuleName() {
? ? return"Examples/UIExplorer/UIExplorerApp.android";
? }
? ....
? super.onCreate(savedInstanceState);}
@Override
publicReactNativeHost getReactNativeHost() {
? return mReactNativeHost;
}
基本的思路就是把之前在 UIExplorerActivity.java 里面的幾個 API 挪到 ReactNativeHost 的實例里面去。
另外,還需要繼續(xù)重寫 getUseDeveloperSupport 這個方法
protected boolean getUseDeveloperSupport() {
? return true;
}
以為在 ReactActivity.java 里面,有兩個地方用到了 (ReactApplication) getApplication() 這個類型轉化,實際上這里會出錯的。因為 getApplication() 的是一個 android.app.Application 類型,而 ReactApplication 這個 interface 跟它沒啥關系。如果不把 getReactNativeHost 和 getUserDeveloperSupport() 這兩個函數重寫掉,會在應用啟動的時候拋異常,直接退出的。
Path must be string, Received undefined
按照上面的流程改完之后,代碼編譯沒有任何問題,安裝之后,啟動了 packager/packager.sh 這個服務,但是 App 加載 JS 的時候報錯了,上面這個錯誤很難定位,所以直接把 node_modules 目錄的東西全部刪掉,重新執(zhí)行了一次 npm install,然后問題就解決了