天堂里的死猪 發表於 2020-6-4 17:55:00

ReactNative混合开发-3 Android混编配置

<div>
<div>
<p>开发语言:ReactNative 0.59.5 Android<br>
开发环境:VSCode Android Studio 3.4</p>
<h1>1、项目目录</h1>
<p>参考文章:集成到现有原生应用</p>
<p>首先,我们按照建立一下目录结构,其中:<br>
Code目录放置所有公用的ReactNative脚本,包,以及相关配置。<br>
Android目录放置原Android项目。</p>
<p>Code (根目录)<br>
--Android(一级目录)</p>
<h1>2、开发环境准备</h1>
<h2>2.1、package.json配置</h2>
<p>在Code目录下创建package.json文件,编辑文件输入以下内容。</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-json"><code class="language-json"><span class="token punctuation">{
<span class="token property">"name"<span class="token operator">: <span class="token string">"AppName"<span class="token punctuation">,
<span class="token property">"version"<span class="token operator">: <span class="token string">"0.0.1"<span class="token punctuation">,
<span class="token property">"private"<span class="token operator">: <span class="token boolean">true<span class="token punctuation">,
<span class="token property">"scripts"<span class="token operator">: <span class="token punctuation">{
    <span class="token property">"start"<span class="token operator">: <span class="token string">"yarn react-native start"
<span class="token punctuation">}
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<h2>2.2、React和React Native模块安装</h2>
<p>在Code目录下使用控制台执行以下语句来安装React Native。</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-csharp"><code class="language-csharp">yarn <span class="token keyword">add react<span class="token operator">-native
</span></span></code></pre>
</div>
<ul>
<li>注意,执行完以上命令后,可能会出现以下提示内容,表示我们需要安装指定版本的React(此例子中需要安装版本为16.8.3的React)。</li>
</ul>
<p>warning " &gt; react-native@0.59.5" has unmet peer dependency "react@16.8.3".</p>
<p>在Code目录下使用控制台执行以下语句来安装指定版本的React</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-css"><code class="language-css">yarn add react@16.8.3
</code></pre>
</div>
<h1>3、配置maven</h1>
<h2>3.1、在app的build.gradle文件中添加React Native依赖</h2>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-cpp"><code class="language-cpp">dependencies <span class="token punctuation">{
    <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">.
    implementation <span class="token string">"com.facebook.react:react-native:+" <span class="token comment">// 新增React Native依赖
<span class="token punctuation">}
</span></span></span></span></span></span></span></code></pre>
</div>
<h2>3.2、在项目的build.gradle文件中添加maven的依赖入口</h2>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-dart"><code class="language-dart">allprojects <span class="token punctuation">{
    repositories <span class="token punctuation">{
      <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">.
      maven <span class="token punctuation">{ url <span class="token string">"$rootDir/../../node_modules/react-native/android"<span class="token punctuation">} <span class="token comment">//注意url路径应该指向根目录code中的node_modules,
    <span class="token punctuation">}
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<h2>3.3、在AndroidManifest.xml声明网络权限</h2>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;manifest <span class="token attr-name"><span class="token namespace">xmlns:android<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"http://schemas.android.com/apk/res/android<span class="token punctuation">"
    <span class="token attr-name">package<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"com.example.reactnativedemo<span class="token punctuation">" <span class="token punctuation">&gt;
   
   
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;uses-permission <span class="token attr-name"><span class="token namespace">android:name<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"android.permission.INTERNET<span class="token punctuation">" <span class="token punctuation">/&gt; //新增网络权限
   ...
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/manifest<span class="token punctuation">&gt;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<h2>3.4、在AndroidManifest.xml配置调试Activity</h2>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-php"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?xml version<span class="token operator">=<span class="token double-quoted-string string">"1.0" encoding<span class="token operator">=<span class="token double-quoted-string string">"utf-8"<span class="token delimiter important">?&gt;
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;manifest <span class="token attr-name"><span class="token namespace">xmlns:android<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"http://schemas.android.com/apk/res/android<span class="token punctuation">"
    <span class="token attr-name">package<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"com.example.reactnativedemo<span class="token punctuation">" <span class="token punctuation">&gt;

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;uses-permission <span class="token attr-name"><span class="token namespace">android:name<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"android.permission.INTERNET<span class="token punctuation">" <span class="token punctuation">/&gt;

    &lt;application
   
      ...
      //调试Activiy,使用摇一摇呼出
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;activity <span class="token attr-name"><span class="token namespace">android:name<span class="token attr-value"><span class="token punctuation">=<span class="token punctuation">"com.facebook.react.devsupport.DevSettingsActivity<span class="token punctuation">" <span class="token punctuation">/&gt;
      


   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/application<span class="token punctuation">&gt;

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/manifest<span class="token punctuation">&gt;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<h1>4、脚本创建</h1>
<p>在Code根目录下创建Scripts文件夹,用于存放React Native的脚本文件</p>
<p>Code (根目录)<br>
--Scripts(一级目录,用于存放所有React Native的脚本)</p>
<p>然后我们可以在Scripts目录下开始写ReactNative的脚本了。<br>
首先我们创建一个FrameText.js,然后写入如下内容:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-jsx"><code class="language-jsx"><span class="token keyword">import React<span class="token punctuation">, <span class="token punctuation">{ Component <span class="token punctuation">} <span class="token keyword">from <span class="token string">'react'
<span class="token keyword">import <span class="token punctuation">{ View<span class="token punctuation">, Text <span class="token punctuation">} <span class="token keyword">from <span class="token string">'react-native'


<span class="token keyword">export <span class="token keyword">default <span class="token keyword">class <span class="token class-name">FrameText <span class="token keyword">extends <span class="token class-name">Component <span class="token punctuation">{

    <span class="token function">render<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">return <span class="token punctuation">(
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;<span class="token class-name">View <span class="token attr-name">style<span class="token script language-javascript"><span class="token script-punctuation punctuation">=<span class="token punctuation">{<span class="token punctuation">{
                width<span class="token punctuation">:<span class="token number">200<span class="token punctuation">,
                height<span class="token punctuation">:<span class="token number">100<span class="token punctuation">,
                backgroundColor<span class="token punctuation">: <span class="token string">'#CDDAF5'
            <span class="token punctuation">}<span class="token punctuation">}<span class="token punctuation">&gt;<span class="token plain-text">
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;<span class="token class-name">Text<span class="token punctuation">&gt;<span class="token punctuation">{<span class="token string">"我来自ReactNative,我是FrameText"<span class="token punctuation">}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/<span class="token class-name">Text<span class="token punctuation">&gt;<span class="token plain-text">
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/<span class="token class-name">View<span class="token punctuation">&gt;
      <span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}
<span class="token punctuation">}
<span class="token comment">// 整体js模块的名称
<span class="token keyword">export <span class="token punctuation">{ FrameText <span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>在FrameText中,我们创建了一个简单的组件,供其他脚本使用。</p>
<p>然后我们再创建一个index.js,然后写入如下内容</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-tsx"><code class="language-tsx"><span class="token keyword">import <span class="token punctuation">{AppRegistry<span class="token punctuation">} <span class="token keyword">from <span class="token string">'react-native'
<span class="token keyword">import <span class="token punctuation">{FrameText<span class="token punctuation">} <span class="token keyword">from <span class="token string">'FrameText'


<span class="token comment">// 整体js模块的名称
AppRegistry<span class="token punctuation">.<span class="token function">registerComponent<span class="token punctuation">(<span class="token string">'Component-1'<span class="token punctuation">, <span class="token punctuation">(<span class="token punctuation">) <span class="token operator">=&gt; FrameText<span class="token punctuation">)<span class="token punctuation">;

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>在index中,我们注册了FrameText组件,供app使用,我们可以在index.js注册很多不同的组件,app可以通过我们注册的名字(本例中为Component-1)来创建这些组件,下面我们来看看怎么在app内使用他们。</p>
<h1>5、Android项目修改</h1>
<p>本例中期望在app的一个controller内,同时使用原生语言与ReactNative脚本分别显示2个View,现在我们来看看是如果在原生app中加载ReactNative的View。</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="400" data-height="711"><img src="//upload-images.jianshu.io/upload_images/16590824-9e0f339acdd76eb5.png?imageMogr2/auto-orient/strip|imageView2/2/w/400/format/webp"></div>
</div>
<div class="image-caption">&nbsp;</div>
</div>
<h2>5.1、创建 MyReactNativeBridge</h2>
<p>新建一个Java文件,创建MyReactNativeBridge类,顾名思义,此类负责桥接原生app与ReactNative,注意,一个app中最好只创建一个桥接实例,所以使用单利模式创建。</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">package <span class="token namespace">com<span class="token punctuation">.example<span class="token punctuation">.reactnativedemo<span class="token punctuation">;

<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.<span class="token class-name">ReactInstanceManager<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.common<span class="token punctuation">.<span class="token class-name">LifecycleState<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.shell<span class="token punctuation">.<span class="token class-name">MainReactPackage<span class="token punctuation">;

<span class="token keyword">public <span class="token keyword">class <span class="token class-name">MyReactNativeBridge <span class="token punctuation">{

    <span class="token keyword">private <span class="token keyword">static <span class="token keyword">final <span class="token class-name">ReactInstanceManager mReactInstanceManager <span class="token operator">= <span class="token class-name">ReactInstanceManager<span class="token punctuation">.<span class="token function">builder<span class="token punctuation">(<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setApplication<span class="token punctuation">(<span class="token class-name">MyApplication<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setBundleAssetName<span class="token punctuation">(<span class="token string">"index.android.bundle"<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setJSMainModulePath<span class="token punctuation">(<span class="token string">"Scripts/index"<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">addPackage<span class="token punctuation">(<span class="token keyword">new <span class="token class-name">MainReactPackage<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setUseDeveloperSupport<span class="token punctuation">(<span class="token class-name">BuildConfig<span class="token punctuation">.DEBUG<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setInitialLifecycleState<span class="token punctuation">(<span class="token class-name">LifecycleState<span class="token punctuation">.RESUMED<span class="token punctuation">)
            <span class="token comment">//注册弹出调试菜单的Activity,发布版可以无需注册
            <span class="token punctuation">.<span class="token function">setCurrentActivity<span class="token punctuation">(<span class="token class-name">MyApplication<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">.<span class="token function">getCurrentActivity<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">build<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;

    <span class="token keyword">private <span class="token class-name">MyReactNativeBridge<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
   
    <span class="token punctuation">}

    <span class="token keyword">public <span class="token keyword">static <span class="token class-name">ReactInstanceManager <span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">return mReactInstanceManager<span class="token punctuation">;
    <span class="token punctuation">}
<span class="token punctuation">}


</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<h2>5.2、创建并使用ReactRootView</h2>
<p>ReactRootView为ReactNative脚本描述的View,它继承FrameLayout,我们可以通过MyReactNativeBridge来创建ReactRootView。</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">public <span class="token keyword">class <span class="token class-name">MainActivity <span class="token keyword">extends <span class="token class-name">AppCompatActivity <span class="token punctuation">{

    <span class="token keyword">private <span class="token class-name">ReactRootView mReactRootView<span class="token punctuation">;
   
    <span class="token class-name">LinearLayout reactView<span class="token punctuation">;
    <span class="token annotation punctuation">@Override
    <span class="token keyword">protected <span class="token keyword">void <span class="token function">onCreate<span class="token punctuation">(<span class="token class-name">Bundle savedInstanceState<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">super<span class="token punctuation">.<span class="token function">onCreate<span class="token punctuation">(savedInstanceState<span class="token punctuation">)<span class="token punctuation">;
      <span class="token function">setContentView<span class="token punctuation">(<span class="token class-name">R<span class="token punctuation">.layout<span class="token punctuation">.activity_main<span class="token punctuation">)<span class="token punctuation">;
      reactView <span class="token operator">= <span class="token function">findViewById<span class="token punctuation">(<span class="token class-name">R<span class="token punctuation">.id<span class="token punctuation">.reactLayout<span class="token punctuation">)<span class="token punctuation">;
      <span class="token class-name">MyApplication<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">.<span class="token function">setCurrentActivity<span class="token punctuation">(<span class="token keyword">this<span class="token punctuation">)<span class="token punctuation">;
      

      mReactRootView <span class="token operator">= <span class="token keyword">new <span class="token class-name">ReactRootView<span class="token punctuation">(<span class="token keyword">this<span class="token punctuation">.<span class="token function">getApplicationContext<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
      mReactRootView<span class="token punctuation">.<span class="token function">startReactApplication<span class="token punctuation">(<span class="token class-name">MyReactNativeBridge<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">, <span class="token string">"Component-1"<span class="token punctuation">, <span class="token keyword">null<span class="token punctuation">)<span class="token punctuation">;

      
      reactView<span class="token punctuation">.<span class="token function">addView<span class="token punctuation">(mReactRootView<span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}

<span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>现在我们在真机上运行模拟器,并且命令开启ReactNative服务器(yarn start),就可以看到上面例子中的画面了。</p>
<h1>6、原生与ReactNative通信</h1>
<h1>6.1、原生向ReactNative传递数据</h1>
<p>注意我们在startReactApplication时的语句的第三个参数initialProperties,代表由原生向ReactNative传递的参数。</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-csharp"><code class="language-csharp">mReactRootView<span class="token punctuation">.<span class="token function">startReactApplication<span class="token punctuation">(MyReactNativeBridge<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">, <span class="token string">"Component-1"<span class="token punctuation">, <span class="token keyword">null<span class="token punctuation">)<span class="token punctuation">;
</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>现在修改创建语句和脚本</p>
<ul>
<li>Java代码:通过initialProperties向JS传递参数</li>
</ul>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">public <span class="token keyword">class <span class="token class-name">MainActivity <span class="token keyword">extends <span class="token class-name">AppCompatActivity <span class="token punctuation">{

    <span class="token keyword">private <span class="token class-name">Bundle mockData <span class="token operator">= <span class="token keyword">new <span class="token class-name">Bundle<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;

    <span class="token keyword">protected <span class="token keyword">void <span class="token function">onCreate<span class="token punctuation">(<span class="token class-name">Bundle savedInstanceState<span class="token punctuation">) <span class="token punctuation">{
      
         <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">.
      mockData<span class="token punctuation">.<span class="token function">putString<span class="token punctuation">(<span class="token string">"content"<span class="token punctuation">, <span class="token string">"初始化"<span class="token punctuation">)<span class="token punctuation">;

      mReactRootView <span class="token operator">= <span class="token keyword">new <span class="token class-name">ReactRootView<span class="token punctuation">(<span class="token keyword">this<span class="token punctuation">.<span class="token function">getApplicationContext<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;
      mReactRootView<span class="token punctuation">.<span class="token function">startReactApplication<span class="token punctuation">(<span class="token class-name">MyReactNativeBridge<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">, <span class="token string">"Component-1"<span class="token punctuation">, mockData<span class="token punctuation">)<span class="token punctuation">;

      reactView<span class="token punctuation">.<span class="token function">addView<span class="token punctuation">(mReactRootView<span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}

<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<ul>
<li>JS脚本:通过this.props["content"]使用原生App传递的参数(也可以使用this.props.content)</li>
</ul>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-jsx"><code class="language-jsx"><span class="token operator">...

<span class="token keyword">export <span class="token keyword">default <span class="token keyword">class <span class="token class-name">FrameText <span class="token keyword">extends <span class="token class-name">Component <span class="token punctuation">{

    <span class="token function">render<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">return <span class="token punctuation">(
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;<span class="token class-name">View <span class="token attr-name">style<span class="token script language-javascript"><span class="token script-punctuation punctuation">=<span class="token punctuation">{<span class="token punctuation">{
                width<span class="token punctuation">:<span class="token number">200<span class="token punctuation">,
                height<span class="token punctuation">:<span class="token number">100<span class="token punctuation">,
                backgroundColor<span class="token punctuation">: <span class="token string">'#CDDAF5'
            <span class="token punctuation">}<span class="token punctuation">}<span class="token punctuation">&gt;<span class="token plain-text">
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;<span class="token class-name">Text<span class="token punctuation">&gt;<span class="token punctuation">{<span class="token keyword">this<span class="token punctuation">.props<span class="token punctuation">[<span class="token string">"content"<span class="token punctuation">]<span class="token punctuation">}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/<span class="token class-name">Text<span class="token punctuation">&gt;<span class="token plain-text">
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/<span class="token class-name">View<span class="token punctuation">&gt;
      <span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}
<span class="token punctuation">}

<span class="token operator">...
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>重新编译代码后,再次运行App,可以看到界面变成如下的样子</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="400" data-height="711"><img src="//upload-images.jianshu.io/upload_images/16590824-a4611edd501fa398.png?imageMogr2/auto-orient/strip|imageView2/2/w/400/format/webp"></div>
</div>
<div class="image-caption">&nbsp;</div>
</div>
<p>ReactRootView还有一个方法setAppProperties,我们可以通过这个方法来对已经创建的View传递参数。</p>
<ul>
<li>Java代码:通过setAppProperties属性向已创建的View传递参数</li>
</ul>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-cpp"><code class="language-cpp"><span class="token keyword">protected <span class="token keyword">void <span class="token function">onCreate<span class="token punctuation">(Bundle savedInstanceState<span class="token punctuation">) <span class="token punctuation">{
    <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">.
   
    mockData<span class="token punctuation">.<span class="token function">putString<span class="token punctuation">(<span class="token string">"content"<span class="token punctuation">, <span class="token string">"重加载"<span class="token punctuation">)<span class="token punctuation">;
    mReactRootView<span class="token punctuation">.<span class="token function">setAppProperties<span class="token punctuation">(mockData<span class="token punctuation">)<span class="token punctuation">;
   
    <span class="token punctuation">.<span class="token punctuation">.<span class="token punctuation">.
<span class="token punctuation">}
   
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>重新编译代码后,再次运行App,可以看到界面变成如下的样子</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill">&nbsp;</div>
<div class="image-view" data-width="400" data-height="711"><img src="//upload-images.jianshu.io/upload_images/16590824-84d1bdb765a768c3.png?imageMogr2/auto-orient/strip|imageView2/2/w/400/format/webp"></div>
</div>
<div class="image-caption">&nbsp;</div>
</div>
<h1>6.2、ReactNative向原生传递数据</h1>
<p>我们使用ReactContextBaseJavaModule来定义一个ReactNative中的NativeModules类型。在ReactContextBaseJavaModule中,我们可以使用@ReactMethod注解来提供结构供脚本回调。</p>
<p>首先我们创建一个MyReactNativeBridge.swift文件</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">package <span class="token namespace">com<span class="token punctuation">.example<span class="token punctuation">.reactnativedemo<span class="token punctuation">;

<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.bridge<span class="token punctuation">.<span class="token class-name">ReactApplicationContext<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.bridge<span class="token punctuation">.<span class="token class-name">ReactContextBaseJavaModule<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.bridge<span class="token punctuation">.<span class="token class-name">ReactMethod<span class="token punctuation">;

<span class="token keyword">public <span class="token keyword">class <span class="token class-name">MyReactNativeCommunication <span class="token keyword">extends <span class="token class-name">ReactContextBaseJavaModule <span class="token punctuation">{


    <span class="token keyword">public <span class="token class-name">MyReactNativeCommunication<span class="token punctuation">(<span class="token class-name">ReactApplicationContext reactContext<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">super<span class="token punctuation">(reactContext<span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}


    <span class="token comment">//提供Test方法
    <span class="token annotation punctuation">@ReactMethod
    <span class="token keyword">public <span class="token keyword">void <span class="token function">test<span class="token punctuation">(<span class="token class-name">String str<span class="token punctuation">) <span class="token punctuation">{
      <span class="token class-name">System<span class="token punctuation">.out<span class="token punctuation">.<span class="token function">println<span class="token punctuation">(str<span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}

    <span class="token comment">//提供在NativeModules中该类的名字
    <span class="token annotation punctuation">@Override
    <span class="token keyword">public <span class="token class-name">String <span class="token function">getName<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">return <span class="token string">"MyReactNativeCommunication"<span class="token punctuation">;
    <span class="token punctuation">}


<span class="token punctuation">}


</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>然后我们使用MyReactNativePackage来注册这个类,否则脚本无法使用</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">package <span class="token namespace">com<span class="token punctuation">.example<span class="token punctuation">.reactnativedemo<span class="token punctuation">;

<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.<span class="token class-name">ReactPackage<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.bridge<span class="token punctuation">.<span class="token class-name">NativeModule<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.bridge<span class="token punctuation">.<span class="token class-name">ReactApplicationContext<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">com<span class="token punctuation">.facebook<span class="token punctuation">.react<span class="token punctuation">.uimanager<span class="token punctuation">.<span class="token class-name">ViewManager<span class="token punctuation">;

<span class="token keyword">import <span class="token namespace">java<span class="token punctuation">.util<span class="token punctuation">.<span class="token class-name">ArrayList<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">java<span class="token punctuation">.util<span class="token punctuation">.<span class="token class-name">Collections<span class="token punctuation">;
<span class="token keyword">import <span class="token namespace">java<span class="token punctuation">.util<span class="token punctuation">.<span class="token class-name">List<span class="token punctuation">;

<span class="token keyword">public <span class="token keyword">class <span class="token class-name">MyReactNativePackage <span class="token keyword">implements <span class="token class-name">ReactPackage <span class="token punctuation">{

    <span class="token annotation punctuation">@Override
    <span class="token keyword">public <span class="token class-name">List<span class="token generics"><span class="token punctuation">&lt;<span class="token class-name">ViewManager<span class="token punctuation">&gt; <span class="token function">createViewManagers<span class="token punctuation">(<span class="token class-name">ReactApplicationContext reactContext<span class="token punctuation">) <span class="token punctuation">{
      <span class="token keyword">return <span class="token class-name">Collections<span class="token punctuation">.<span class="token function">emptyList<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
    <span class="token punctuation">}


    <span class="token annotation punctuation">@Override
    <span class="token keyword">public <span class="token class-name">List<span class="token generics"><span class="token punctuation">&lt;<span class="token class-name">NativeModule<span class="token punctuation">&gt; <span class="token function">createNativeModules<span class="token punctuation">(
            <span class="token class-name">ReactApplicationContext reactContext<span class="token punctuation">) <span class="token punctuation">{
      <span class="token class-name">List<span class="token generics"><span class="token punctuation">&lt;<span class="token class-name">NativeModule<span class="token punctuation">&gt; modules <span class="token operator">= <span class="token keyword">new <span class="token class-name">ArrayList<span class="token generics"><span class="token punctuation">&lt;<span class="token punctuation">&gt;<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;

      modules<span class="token punctuation">.<span class="token function">add<span class="token punctuation">(<span class="token keyword">new <span class="token class-name">MyReactNativeCommunication<span class="token punctuation">(reactContext<span class="token punctuation">)<span class="token punctuation">)<span class="token punctuation">;

      <span class="token keyword">return modules<span class="token punctuation">;
    <span class="token punctuation">}

<span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>然后在MyReactNativeBridge将MyReactNativePackage添加到mReactInstanceManager中</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-java"><code class="language-java"><span class="token keyword">public <span class="token keyword">class <span class="token class-name">MyReactNativeBridge <span class="token punctuation">{

    <span class="token keyword">private <span class="token keyword">static <span class="token keyword">final <span class="token class-name">ReactInstanceManager mReactInstanceManager <span class="token operator">= <span class="token class-name">ReactInstanceManager<span class="token punctuation">.<span class="token function">builder<span class="token punctuation">(<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setApplication<span class="token punctuation">(<span class="token class-name">MyApplication<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setBundleAssetName<span class="token punctuation">(<span class="token string">"index.android.bundle"<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setJSMainModulePath<span class="token punctuation">(<span class="token string">"Scripts/index"<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">addPackage<span class="token punctuation">(<span class="token keyword">new <span class="token class-name">MainReactPackage<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">addPackage<span class="token punctuation">(<span class="token keyword">new <span class="token class-name">MyReactNativePackage<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)<span class="token comment">//新增MyReactNativePackage
            <span class="token punctuation">.<span class="token function">setUseDeveloperSupport<span class="token punctuation">(<span class="token class-name">BuildConfig<span class="token punctuation">.DEBUG<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setInitialLifecycleState<span class="token punctuation">(<span class="token class-name">LifecycleState<span class="token punctuation">.RESUMED<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">setCurrentActivity<span class="token punctuation">(<span class="token class-name">MyApplication<span class="token punctuation">.<span class="token function">getInstance<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">.<span class="token function">getCurrentActivity<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">)
            <span class="token punctuation">.<span class="token function">build<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>最后修改JS代码,调用test方法</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-jsx"><code class="language-jsx"><span class="token keyword">import <span class="token punctuation">{ NativeModules <span class="token punctuation">} <span class="token keyword">from <span class="token string">'react-native'


<span class="token keyword">export <span class="token keyword">default <span class="token keyword">class <span class="token class-name">FrameText <span class="token keyword">extends <span class="token class-name">Component <span class="token punctuation">{

    <span class="token function">render<span class="token punctuation">(<span class="token punctuation">) <span class="token punctuation">{
      NativeModules<span class="token punctuation">.MyReactNativeCommunication<span class="token punctuation">.<span class="token function">test<span class="token punctuation">(<span class="token string">"我回来啦"<span class="token punctuation">)<span class="token punctuation">;
      <span class="token operator">...
    <span class="token punctuation">}
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>重新编译代码后,再次运行App,可以看到Android的输出 “我回来啦”</p>
</div>
<br><br>作者:肆点壹陆<br>链接:https://www.jianshu.com/p/e1ac474a9bb1<br>来源:简书<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</div><br><br>
来源:https://www.cnblogs.com/qing123/p/13045090.html
頁: [1]
查看完整版本: ReactNative混合开发-3 Android混编配置