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> </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> </p>
</blockquote>
</div><br><br>
来源:https://www.cnblogs.com/geowo/p/14941724.html
頁:
[1]