摘要:運行新應用的采坑記錄指定和的版本。這個軟件很好用設置支持的庫架構把原生項目拷貝到項目的目錄下上面步驟可以運行一個的簡單項目,接下來時怎么集成到現有的項目項目結構如下我們做的話,是用打開這個目錄的。
集成步驟
官方文檔:https://facebook.github.io/react-native/docs/0.54/integration-with-existing-apps
借鑒博客:https://blog.csdn.net/u012455...
(1)配置react-native的開發環境
(2)創建一個react-native 的項目
(3)把項目中的android目錄里面的東西換成現有的項目
(4)配置android項目的build.gradle文件以及各種依賴
(5)運行項目,運行服務,設置ip端口調試。
(6)各種踩坑問題,比如不支持64位手機的so庫問題,找不到服務,由于react native 版本問題導致的各種錯誤等等
官方文檔的集成步驟;
1、安裝 node.js python2 jdk 8
這個安裝過程就不說了。網上一大堆
2、下載更新React Native CLI
命令:npm install -g react-native-cli
執行這行命令就可以使用react-native 命令了。比如 使用命令運行
3、android 環境配置和模擬器或者手機連接
由于我是做android的,所以這些就跳過了,不清楚的看官方文檔或者上網查
4、創建新的應用程序
重點來了,創建應用的時候執行命令:react-native init AwesomeProject 這里的AwesomeProject是項目名稱可以隨便換,但是必須以字母開頭。 由于下載是在國外所以特別慢,所以我們要添加以下國內鏡像。
npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/dist
這兩個都可以,會顯著提高下載速度。設置了鏡像,然后再執行創建的命令。
5、運行新應用的采坑記錄
指定react 和react-native 的版本。
項目目錄下的 node_modules 文件夾是 reactnative 所依賴的js的一些東西。
如果沒有,我們可以再項目跟目錄執行 npm install 命令下載
這個時候我們要注意一下版本號,因為這里遇到坑了。目前最新的react--native可能是0.56 會出現一個bug
比如最新版本
react-native-cli: 2.0.1 react-native: 0.56.0
但是運行的時候出現 Unable to resolve module "AccessibilityInfo" 這個錯誤,所以建議還是版本低一點,這里使用穩定版
切換步驟:
(1)先將舊版卸載
npm uninstall -g react-native-cli npm uninstall -g react-native
(2)再安裝指定版本
npm install -g react-native@0.55.4 npm install -g react-native-cli@1.2.0
可以再項目初始化的時候指定下,不指定的話,只要版本對也沒問題,自己查看下
react-native init --version="0.55.4" myFirstApp
6、解決紅屏錯誤:Module build failed: Error: Plugin 0 specified in “base” … provided an invalid property of “default”
如果出現上面錯誤執行下面命令
npm install --save-dev babel-preset-react-native@2.1.0
7、解決 React_Native 無法運行再64位機器上
"/data/data/com.xxx.xxx/lib-main/libgnustl_shared.so" is 32-bit instead of 64-bit 這個錯誤
參考文章:https://blog.csdn.net/u013531824/article/details/53931307
Android不能同時加載32和64位本機庫。 如果您至少有一個依賴庫使用ARM64支持編譯的擴展,而另外一些依賴庫僅支持ARM32,就會出現問題。 系統將檢測ARM64依賴關系,加載它,然后拒絕加載僅ARM32的so庫,就可能導致應用程序崩潰。
所以,要再項目中excute 64位的幾個so庫,使用32位的。
這個根據不同項目設置,查一下自己項目用到了哪些64位的so庫,都設置一遍
我的項目需要移除這些,然后就不報錯了。Native Libs Monitor 這個軟件很好用
ndk { //設置支持的SO庫架構 abiFilters "armeabi", "x86", "armeabi-v7a", "x86_64", "arm64-v8a" } packagingOptions { exclude "lib/arm64-v8a/libgnustl_shared.so" exclude "lib/arm64-v8a/libijkffmpeg.so" exclude "lib/arm64-v8a/libijkplayer.so" exclude "lib/arm64-v8a/libijksdl.so" exclude "lib/arm64-v8a/libimagepipeline.so" exclude "lib/arm64-v8a/librtmp-jni.so" }
8、把android 原生項目拷貝到reactnative 項目的android 目錄下
上面步驟可以運行一個react-native 的簡單項目,接下來時怎么集成到現有的Android 項目
react-native 項目結構如下:
我們做android的話,是用Android studio 打開 android 這個目錄的。
6、修改gradle 的依賴配置
dependencies {}閉包下 所有的compile 替換位implementation 或者api因為我的Android studio是3.1.3,老報錯說compile 2018年底要刪除已廢棄。另外我的gradle是4.4 build gradle 工具 是3.1.3
(1)Android 項目根目錄的 build.gradle文件修改
如下:如果還是不行,建議跟我一樣,加上google(). .可能如果是最新版 jencter有問題,用的時候調整下順序試一試。盡量不要用最新版本的react-native
allprojects { repositories { google() jcenter() maven { url "https://jitpack.io" } //添加這個maven地址,不然無法下載 react-native庫 maven { // All of React Native (JS, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } } }
再app 的build.gradle 中添加依賴
使用api 或者implementation 都可以, 這里我也制定了版本。
dependencies { ......... api "com.facebook.react:react-native:0.55.4" }
7、配置權限
//我還要添加一個權限,建議也添加了
再調試的時候我們一般需要訪問DevSettingsActivity,所以也需要添加到AndroidManifest.xml:
手機搖一搖,或者菜單,設置 電腦服務的ip地址和端口要用到
8、代碼集成
剛剛創建的最簡單的react-native 已經有了。我們就再我們Android 項目中加載這個最簡單的頁面
public class MyReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler { private final int OVERLAY_PERMISSION_REQ_CODE = 1; private ReactRootView mReactRootView; private ReactInstanceManager mReactInstanceManager; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //這里不加權限判斷 6.0或以上機型會閃退 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE); } } mReactRootView = new ReactRootView(this); mReactInstanceManager = ReactInstanceManager.builder() .setApplication(getApplication()) //這是設置assets目錄下的打包過的js文件名 這個文件可用命令生成 但調試期間我們使用npm server動態注入 發布時才將它打進assets .setBundleAssetName("index.android.bundle") //這里設置js入口文件 舊一點的api可能是setJSMainModuleName 但我的版本是0.51.0 取而代之的是setJSMainModulePath方法 .setJSMainModulePath("index") .addPackage(new MainReactPackage()) .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState(LifecycleState.RESUMED) .build(); // 注意這里的“FirstApp”必須 // 對應index.js”中的“AppRegistry.registerComponent()”的第一個參數值 // 對應“package.json”中的“name”屬性值 // 最好也將“app.json”中的“name”和“displayName”改成它 mReactRootView.startReactApplication(mReactInstanceManager, "FirstApp", null); setContentView(mReactRootView); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == OVERLAY_PERMISSION_REQ_CODE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { } } } } @Override public void invokeDefaultOnBackPressed() { super.onBackPressed(); } @Override protected void onPause() { super.onPause(); if (mReactInstanceManager != null) { mReactInstanceManager.onHostPause(this); } } @Override protected void onResume() { super.onResume(); if (mReactInstanceManager != null) { mReactInstanceManager.onHostResume(this, this); } } @Override protected void onDestroy() { super.onDestroy(); if (mReactInstanceManager != null) { mReactInstanceManager.onHostDestroy(this); } if (mReactRootView != null) { mReactRootView.unmountReactApplication(); } } @Override public void onBackPressed() { if (mReactInstanceManager != null) { mReactInstanceManager.onBackPressed(); } else { super.onBackPressed(); } } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { mReactInstanceManager.showDevOptionsDialog(); return true; } return super.onKeyUp(keyCode, event); } }
以上是我的activity,大概意思和官網一樣。。代碼直接復制就行,需要注意的是:
代碼制定的文件名一定要和 配置文件中的一致,要檢查
app.json中的name和displayName屬性值
ndex.js中registerComponent的第一個參數值
package.json中的name屬性值
這幾個值要保持一致
9、在真機上運行項目
直接在 reat-native 項目根目錄運行命令 react-native run-android , 跳轉到上面activity
然后運行起來如果是紅屏,說是連不上服務,就搖一搖手機,選擇 Debug server host 啥的,設置電腦的ip:8081 這樣就能打開了。
或者,直接用Android studio 運行自己的Android 項目, 跳轉到上面react 的activity ,也可以是fragment的。
如果出現錯誤,繼續百度谷歌解決。。。有坑是肯定的嘛。先記錄這些
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96410.html
摘要:因而對于現有的普通列表界面,要替換成側滑列表,改動相對小些。如果想要實現類似那樣的側滑效果,就不能給每個按鈕都設置背景色,需要稍微投機取巧下。相關代碼有分組的側滑列表無分組的側滑列表 如果列表行數據需要更多的操作,使用側滑菜單是移動端比較常見的方式,也符合用戶的操作習慣,對app的接受度自然會相對提高點。最近得空就把原來的react-native項目升級了側滑操作,輕輕松松支持andr...
閱讀 1882·2021-11-11 16:55
閱讀 2064·2021-10-08 10:13
閱讀 739·2019-08-30 11:01
閱讀 2155·2019-08-29 13:19
閱讀 3277·2019-08-28 18:18
閱讀 2620·2019-08-26 13:26
閱讀 579·2019-08-26 11:40
閱讀 1864·2019-08-23 17:17