今生无忧 發表於 2021-6-27 18:56:00

Android Flutter混合开发实现

<div class="post-body">
<h1 id="混合开发">混合开发</h1>
<blockquote>
<p>目前来说作为纯Flutter开发的app较少,基本都是将flutter作为共用的组件来开发、在Android\iOS原生项目中引入进行使用,而且个人感觉Android Studio对Native引用Flutter项目的支持比较好(AS 3.6)</p>
</blockquote>
<h1 id="Android-Native中引入Flutter">Android Native中引入Flutter</h1>
<h2 id="创建项目">创建项目</h2>
<ul>
<li>按照一般流程创建即可,此处用的是androidx项目
<h2 id="创建flutter-module">创建flutter_module</h2>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br></span></span></pre>
</td>
<td class="code">
<pre><span class="line">//加入--androidx是为了创建androidx的flutter项目,不需要则去掉<br><span class="line">flutter create --androidx -t module flutter_module<br></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
</li>
</ul>
<blockquote>
<p>一般在Native项目的同级目录下创建flutter module,方便其他平台项目引用,命名不要使用单一的<code>flutter</code>,在引入flutter module之后,Android Studio会在Native项目下会自动生成一个<code>Flutter</code>module</p>
</blockquote>
<h2 id="引入flutter-module">引入flutter_module</h2>
<ul>
<li>
<p><code>setting.gradle</code>中添加module依赖</p>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br><span class="line">3<br><span class="line">4<br><span class="line">5<br><span class="line">6<br><span class="line">7<br></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">setBinding(new Binding())<br><span class="line">evaluate(new File(<br><span class="line">        //如果module创建在了Native根目录下,此处的parentFile需要去掉<br><span class="line">      settingsDir.parentFile,<br><span class="line">      //创建的flutter module名称,如果是他人提供的已实现的module,需要先用AS编译下或运行下`flutter pub get`<br><span class="line">      'flutter_module/.android/include_flutter.groovy'<br><span class="line">))<br></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
</li>
<li>
<p><code>app/build.gradle</code>引用<code>flutter</code></p>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br><span class="line">3<br><span class="line">4<br><span class="line">5<br><span class="line">6<br><span class="line">7<br><span class="line">8<br><span class="line">9<br><span class="line">10<br><span class="line">11<br><span class="line">12<br><span class="line">13<br><span class="line">14<br><span class="line">15<br><span class="line">16<br><span class="line">17<br><span class="line">18<br><span class="line">19<br><span class="line">20<br><span class="line">21<br><span class="line">22<br><span class="line">23<br><span class="line">24<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">android {<br><span class="line">    //....省略<br><span class="line">    defaultConfig {<br><span class="line">        //...<br><span class="line"><br><span class="line">        //minSdkVersion需要保证大于16<br><span class="line">      minSdkVersion 21<br><span class="line">    }<br><span class="line"><br><span class="line">    compileOptions {<br><span class="line">        //使用java1.8来编译<br><span class="line">      sourceCompatibility JavaVersion.VERSION_1_8<br><span class="line">      targetCompatibility JavaVersion.VERSION_1_8<br><span class="line">    }<br><span class="line"><br><span class="line">}<br><span class="line"><br><span class="line">dependencies {<br><span class="line">    //....省略<br><span class="line"><br><span class="line">    //注意此处引用的是`flutter`,即Native项目自动生成的module<br><span class="line">    //而不是import的`flutter module`<br><span class="line">    implementation project(':flutter')<br><span class="line">}<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
</li>
</ul>
<h2 id="使用">使用</h2>
<h3 id="Fragment">Fragment</h3>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br><span class="line">3<br><span class="line">4<br><span class="line">5<br><span class="line">6<br><span class="line">7<br><span class="line">8<br></span></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">val transaction = supportFragmentManager.beginTransaction()<br><span class="line">transaction.replace(<br><span class="line">    android.R.id.content,<br><span class="line">    //flutter 1.12之后,Flutter类弃用<br><span class="line">    //Flutter.initialRoute("initialRoute").build()<br><span class="line">    FlutterFragment.withNewEngine().initialRoute("initialRoute").build()<br><span class="line">)<br><span class="line">transaction.commit()<br></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<h3 id="Activity">Activity</h3>
<blockquote>
<p>需要先把<code>io.flutter.embedding.android.FlutterActivity</code>添加至<code>AndroidManifest</code>清单中</p>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br><span class="line">3<br></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">val intent = io.flutter.embedding.android.FlutterActivity.withNewEngine()<br><span class="line">    .initialRoute("initialRoute").build(this)<br><span class="line">startActivity(intent)<br></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
</blockquote>
<h3 id="View">View</h3>
<blockquote>
<p>1.12之后似乎不再建议使用FlutterView来嵌入Native中</p>
<div class="table-container">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br><span class="line">2<br><span class="line">3<br><span class="line">4<br><span class="line">5<br><span class="line">6<br><span class="line">7<br><span class="line">8<br><span class="line">9<br><span class="line">10<br><span class="line">11<br><span class="line">12<br><span class="line">13<br><span class="line">14<br><span class="line">15<br><span class="line">16<br><span class="line">17<br><span class="line">18<br><span class="line">19<br><span class="line">20<br><span class="line">21<br><span class="line">22<br><span class="line">23<br><span class="line">24<br><span class="line">25<br><span class="line">26<br><span class="line">27<br><span class="line">28<br><span class="line">29<br><span class="line">30<br><span class="line">31<br><span class="line">32<br><span class="line">33<br><span class="line">34<br><span class="line">35<br><span class="line">36<br><span class="line">37<br><span class="line">38<br><span class="line">39<br><span class="line">40<br><span class="line">41<br><span class="line">42<br><span class="line">43<br><span class="line">44<br><span class="line">45<br><span class="line">46<br><span class="line">47<br><span class="line">48<br><span class="line">49<br><span class="line">50<br><span class="line">51<br><span class="line">52<br><span class="line">53<br><span class="line">54<br><span class="line">55<br><span class="line">56<br><span class="line">57<br><span class="line">58<br><span class="line">59<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line"><br><span class="line">import android.os.Bundle<br><span class="line">import android.util.Log<br><span class="line">import android.widget.FrameLayout<br><span class="line">import androidx.appcompat.app.AppCompatActivity<br><span class="line">import io.flutter.embedding.android.FlutterView<br><span class="line">import io.flutter.embedding.engine.FlutterEngine<br><span class="line">import io.flutter.embedding.engine.dart.DartExecutor<br><span class="line">import io.flutter.embedding.engine.renderer.FlutterUiDisplayListener<br><span class="line"><br><span class="line">class MainActivity : FlutterActivity() {<br><span class="line"><br><span class="line">    lateinit var flutterEngine: FlutterEngine<br><span class="line"><br><span class="line">    companion object {<br><span class="line">      const val TAG = "MainActivity"<br><span class="line">    }<br><span class="line"><br><span class="line">    override fun onCreate(savedInstanceState: Bundle?) {<br><span class="line">      FlutterMain.startInitialization(applicationContext)<br><span class="line">      super.onCreate(savedInstanceState)<br><span class="line"><br><span class="line">      val layout = FrameLayout(this)<br><span class="line">      setContentView(layout)<br><span class="line">      flutterEngine = FlutterEngine(this)<br><span class="line">      flutterEngine.navigationChannel.setInitialRoute("initialRoute")<br><span class="line">      flutterEngine.dartExecutor.executeDartEntrypoint(<br><span class="line">            DartExecutor.DartEntrypoint.createDefault()<br><span class="line">      )<br><span class="line"><br><span class="line">      val flutterView = FlutterView(this)<br><span class="line">      val lp = FrameLayout.LayoutParams(<br><span class="line">            FrameLayout.LayoutParams.MATCH_PARENT,<br><span class="line">            FrameLayout.LayoutParams.MATCH_PARENT<br><span class="line">      )<br><span class="line">      flutterView.addOnFirstFrameRenderedListener(object : FlutterUiDisplayListener {<br><span class="line">            override fun onFlutterUiNoLongerDisplayed() {<br><span class="line">                Log.d(TAG, "onFlutterUiNoLongerDisplayed: ")<br><span class="line">            }<br><span class="line"><br><span class="line">            override fun onFlutterUiDisplayed() {<br><span class="line">                Log.d(TAG, "onFlutterUiDisplayed: ")<br><span class="line">            }<br><span class="line">      })<br><span class="line">      layout.addView(flutterView, lp)<br><span class="line">      flutterView.attachToFlutterEngine(flutterEngine)<br><span class="line">    }<br><span class="line"><br><span class="line">    override fun onResume() {<br><span class="line">      super.onResume()<br><span class="line">      flutterEngine.lifecycleChannel.appIsResumed()<br><span class="line">    }<br><span class="line"><br><span class="line">    override fun onPause() {<br><span class="line">      super.onPause()<br><span class="line">      flutterEngine.lifecycleChannel.appIsPaused()<br><span class="line">    }<br><span class="line">    <br><span class="line">}<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
</blockquote>
</div><br><br>
来源:https://www.cnblogs.com/geowo/p/14941724.html
頁: [1]
查看完整版本: Android Flutter混合开发实现