酷卡通 發表於 2026-1-4 08:54:31

Flutter Android View在鸿蒙系统上的使用指南

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. 插件介绍</li><li>2. 插件功能特性</li><li>3. 快速开始</li><ul class="second_class_ul"><li>3.1 环境要求</li><li>3.2 引入依赖</li></ul><li>4. 使用方法</li><ul class="second_class_ul"><li>4.1 鸿蒙应用中嵌入 Flutter 视图</li><li>4.2 Flutter 模块开发</li><li>4.3 原生与 Flutter 之间的通信</li></ul><li>5. 构建与运行</li><ul class="second_class_ul"><li>5.1 构建 Flutter 模块</li><li>5.2 构建鸿蒙应用</li><li>5.3 运行应用</li></ul><li>6. 常见问题与解决方案</li><ul class="second_class_ul"><li>6.1 Flutter 视图无法加载</li><li>6.2 原生插件无法正常工作</li><li>6.3 性能问题</li></ul><li>7. 总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>1. 插件介绍</h2>
<p>Flutter Android View 是一个用于在 Android 应用中以视图级别集成 Flutter 模块的示例项目。它展示了如何将 Flutter 组件作为原生 Android 视图嵌入到现有应用中,实现 Flutter 与原生代码的无缝交互和混合开发。</p>
<p>这个示例项目特别适合以下场景:</p>
<ul><li>需要在现有鸿蒙应用中逐步引入 Flutter 功能</li><li>希望在同一屏幕上同时展示原生鸿蒙 UI 和 Flutter UI</li><li>想利用 Flutter 的跨平台能力,同时保留现有鸿蒙应用的核心功能</li></ul>
<p class="maodian"></p><h2>2. 插件功能特性</h2>
<ul><li>支持在鸿蒙应用中以视图级别嵌入 Flutter 组件</li><li>实现原生鸿蒙与 Flutter 之间的双向通信</li><li>支持 Flutter 模块使用原生插件(如 url_launcher、sensors 等)</li><li>提供了完整的示例代码,包括列表展示和交互功能</li><li>支持热重载,提高开发效率</li></ul>
<p class="maodian"></p><h2>3. 快速开始</h2>
<p class="maodian"></p><h3>3.1 环境要求</h3>
<ul><li>Flutter SDK 2.19.5 或更高版本</li><li>HarmonyOS SDK 3.0 或更高版本</li><li>DevEco Studio 3.0 或更高版本</li><li>JDK 11 或更高版本</li></ul>
<p class="maodian"></p><h3>3.2 引入依赖</h3>
<p>由于这是一个自定义修改版本的三方库,需要通过 Git 形式引入。在项目的 <code>pubspec.yaml</code> 文件中添加以下配置:</p>
<div class="jb51code"><pre class="brush:yaml;">dependencies:
flutter:
    sdk: flutter
flutter_module_using_plugin:
    git:
      url: "https://atomgit.com/flutter/samples.git"
      path: "add_to_app/android_view/flutter_module_using_plugin"
provider: ^6.0.2
url_launcher: ^6.0.6
sensors: ^2.0.3
</pre></div>
<p>然后运行以下命令获取依赖:</p>
<div class="jb51code"><pre class="brush:bash;">flutter pub get
</pre></div>
<p class="maodian"></p><h2>4. 使用方法</h2>
<p class="maodian"></p><h3>4.1 鸿蒙应用中嵌入 Flutter 视图</h3>
<ol><li>在鸿蒙应用的布局文件中添加 Flutter 视图容器:</li></ol>
<div class="jb51code"><pre class="brush:xml;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical"&gt;
   
    &lt;!-- 鸿蒙原生 UI 组件 --&gt;
    &lt;Text
      ohos:height="60vp"
      ohos:width="match_parent"
      ohos:text="鸿蒙原生标题栏"
      ohos:text_size="20fp"
      ohos:text_alignment="center"
      ohos:background_element="#FF007AFF"/&gt;
   
    &lt;!-- Flutter 视图容器 --&gt;
    &lt;ComponentContainer
      ohos:id="$+id:flutter_container"
      ohos:height="match_parent"
      ohos:width="match_parent"/&gt;
&lt;/DirectionalLayout&gt;
</pre></div>
<ol start="2"><li>在鸿蒙应用的 AbilitySlice 中初始化并加载 Flutter 视图:</li></ol>
<div class="jb51code"><pre class="brush:java;">import com.huawei.flutter.hmos.adapter.FlutterView;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.ComponentContainer;

public class MainAbilitySlice extends AbilitySlice {
    private FlutterView flutterView;
   
    @Override
    public void onStart(Intent intent) {
      super.onStart(intent);
      super.setUIContent(ResourceTable.Layout_ability_main);
      
      // 获取 Flutter 视图容器
      ComponentContainer flutterContainer = (ComponentContainer) findComponentById(ResourceTable.Id_flutter_container);
      
      // 初始化 Flutter 视图
      flutterView = new FlutterView(getContext());
      flutterView.setBundleName("dev.flutter.example.flutter_module_using_plugin");
      flutterView.setEntrypoint("main");
      
      // 将 Flutter 视图添加到容器中
      flutterContainer.addComponent(flutterView);
      
      // 启动 Flutter 引擎
      flutterView.initialize();
    }
   
    @Override
    protected void onForeground(Intent intent) {
      super.onForeground(intent);
      if (flutterView != null) {
            flutterView.onForeground();
      }
    }
   
    @Override
    protected void onBackground() {
      super.onBackground();
      if (flutterView != null) {
            flutterView.onBackground();
      }
    }
   
    @Override
    protected void onStop() {
      super.onStop();
      if (flutterView != null) {
            flutterView.onStop();
      }
    }
}
</pre></div>
<p class="maodian"></p><h3>4.2 Flutter 模块开发</h3>
<ol><li>在 Flutter 模块中创建 UI 组件:</li></ol>
<div class="jb51code"><pre class="brush:java;">import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:sensors/sensors.dart';

class FlutterAndroidViewExample extends StatefulWidget {
@override
_FlutterAndroidViewExampleState createState() =&gt; _FlutterAndroidViewExampleState();
}

class _FlutterAndroidViewExampleState extends State&lt;FlutterAndroidViewExample&gt; {
List&lt;double&gt; _accelerometerValues;
List&lt;double&gt; _userAccelerometerValues;
List&lt;double&gt; _gyroscopeValues;
final _streamSubscriptions = &lt;StreamSubscription&lt;dynamic&gt;&gt;[];

@override
void initState() {
    super.initState();
    _streamSubscriptions.add(
      accelerometerEvents.listen(
      (AccelerometerEvent event) {
          setState(() {
            _accelerometerValues = &lt;double&gt;;
          });
      },
      ),
    );
    _streamSubscriptions.add(
      userAccelerometerEvents.listen(
      (UserAccelerometerEvent event) {
          setState(() {
            _userAccelerometerValues = &lt;double&gt;;
          });
      },
      ),
    );
    _streamSubscriptions.add(
      gyroscopeEvents.listen(
      (GyroscopeEvent event) {
          setState(() {
            _gyroscopeValues = &lt;double&gt;;
          });
      },
      ),
    );
}

@override
void dispose() {
    super.dispose();
    for (final subscription in _streamSubscriptions) {
      subscription.cancel();
    }
}

@override
Widget build(BuildContext context) {
    final accelerometer = _accelerometerValues != null
      ? _accelerometerValues.map((double v) =&gt; v.toStringAsFixed(1)).toList()
      : &lt;String&gt;['0.0', '0.0', '0.0'];
    final userAccelerometer = _userAccelerometerValues != null
      ? _userAccelerometerValues.map((double v) =&gt; v.toStringAsFixed(1)).toList()
      : &lt;String&gt;['0.0', '0.0', '0.0'];
    final gyroscope = _gyroscopeValues != null
      ? _gyroscopeValues.map((double v) =&gt; v.toStringAsFixed(1)).toList()
      : &lt;String&gt;['0.0', '0.0', '0.0'];

    return MaterialApp(
      home: Scaffold(
      appBar: AppBar(
          title: const Text('Flutter Android View Example'),
      ),
      body: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: &lt;Widget&gt;[
            Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: &lt;Widget&gt;[
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text(
                  'Accelerometer: $accelerometer',
                  style: TextStyle(fontSize: 16.0),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text(
                  'User Accelerometer: $userAccelerometer',
                  style: TextStyle(fontSize: 16.0),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text(
                  'Gyroscope: $gyroscope',
                  style: TextStyle(fontSize: 16.0),
                  ),
                ),
            ],
            ),
            ElevatedButton(
            child: const Text('Open Flutter Website'),
            onPressed: () {
                launch('https://flutter.dev');
            },
            ),
          ],
      ),
      ),
    );
}
}
</pre></div>
<p class="maodian"></p><h3>4.3 原生与 Flutter 之间的通信</h3>
<p>Flutter 模块可以通过 MethodChannel 与鸿蒙原生代码进行通信:</p>
<ol><li>在 Flutter 模块中设置 MethodChannel:</li></ol>
<div class="jb51code"><pre class="brush:java;">import 'package:flutter/services.dart';

class _FlutterAndroidViewExampleState extends State&lt;FlutterAndroidViewExample&gt; {
static const platform = MethodChannel('dev.flutter.example/channel');

Future&lt;void&gt; _callNativeMethod() async {
    try {
      final String result = await platform.invokeMethod('nativeMethod');
      print('Native method result: $result');
    } on PlatformException catch (e) {
      print('Failed to call native method: ${e.message}');
    }
}

// ...
}
</pre></div>
<ol start="2"><li>在鸿蒙原生代码中注册 MethodChannel:</li></ol>
<div class="jb51code"><pre class="brush:java;">import com.huawei.flutter.hmos.adapter.MethodChannel;
import com.huawei.flutter.hmos.adapter.MethodCallHandler;
import com.huawei.flutter.hmos.adapter.MethodCall;
import com.huawei.flutter.hmos.adapter.Result;

public class MainAbilitySlice extends AbilitySlice {
    private FlutterView flutterView;
   
    @Override
    public void onStart(Intent intent) {
      // ... 初始化 FlutterView 代码 ...
      
      // 注册 MethodChannel
      new MethodChannel(flutterView.getFlutterEngine().getDartExecutor().getBinaryMessenger(), "dev.flutter.example/channel")
            .setMethodCallHandler(new MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall call, Result result) {
                  if (call.method.equals("nativeMethod")) {
                        String response = "Hello from HarmonyOS native code!";
                        result.success(response);
                  } else {
                        result.notImplemented();
                  }
                }
            });
    }
   
    // ...
}
</pre></div>
<p class="maodian"></p><h2>5. 构建与运行</h2>
<p class="maodian"></p><h3>5.1 构建 Flutter 模块</h3>
<p>在 Flutter 模块目录下运行以下命令构建 Flutter AAR:</p>
<div class="jb51code"><pre class="brush:bash;">flutter build aar --no-debug --no-profile
</pre></div>
<p class="maodian"></p><h3>5.2 构建鸿蒙应用</h3>
<p>在 DevEco Studio 中打开鸿蒙应用项目,然后点击 &ldquo;Build&rdquo; -&gt; &ldquo;Build HAP(s)/APP(s)&rdquo; -&gt; &ldquo;Build APP(s)&rdquo; 构建完整的鸿蒙应用。</p>
<p class="maodian"></p><h3>5.3 运行应用</h3>
<p>将鸿蒙设备连接到开发机,然后在 DevEco Studio 中点击 &ldquo;Run&rdquo; 按钮或使用以下命令运行应用:</p>
<div class="jb51code"><pre class="brush:bash;">hap build install
</pre></div>
<p class="maodian"></p><h2>6. 常见问题与解决方案</h2>
<p class="maodian"></p><h3>6.1 Flutter 视图无法加载</h3>
<p><strong>问题</strong>:鸿蒙应用中 Flutter 视图显示为空白或无法加载。</p>
<p><strong>解决方案</strong>:</p>
<ol><li>检查 Flutter SDK 版本是否符合要求(2.19.5 或更高)</li><li>确保 Flutter 模块已正确构建(运行 <code>flutter build aar</code>)</li><li>检查鸿蒙应用的 <code>config.json</code> 文件中是否已配置 Flutter 相关权限</li><li>查看日志获取详细错误信息:<code>hdc shell logcat -s Flutter</code></li></ol>
<p class="maodian"></p><h3>6.2 原生插件无法正常工作</h3>
<p><strong>问题</strong>:Flutter 模块中使用的原生插件(如 url_launcher、sensors)在鸿蒙应用中无法正常工作。</p>
<p><strong>解决方案</strong>:</p>
<ol><li>确保插件版本与 Flutter SDK 版本兼容</li><li>检查鸿蒙应用是否已添加必要的权限(如网络权限、传感器权限等)</li><li>对于自定义插件,需要确保已适配鸿蒙系统</li></ol>
<p class="maodian"></p><h3>6.3 性能问题</h3>
<p><strong>问题</strong>:嵌入 Flutter 视图后,鸿蒙应用的性能下降。</p>
<p><strong>解决方案</strong>:</p>
<ol><li>避免在同一屏幕上嵌入过多 Flutter 视图</li><li>优化 Flutter 代码,减少不必要的重建和重绘</li><li>合理使用 Flutter 的异步加载和缓存机制</li><li>考虑使用 Flutter 的 release 模式构建应用(<code>flutter build aar --release</code>)</li></ol>
<p class="maodian"></p><h2>7. 总结</h2>
<p>Flutter Android View 提供了一种在鸿蒙应用中以视图级别集成 Flutter 模块的有效方式,它允许开发者逐步将 Flutter 功能引入现有鸿蒙应用,实现原生与 Flutter 的混合开发。</p>
<p>通过本文的指南,您已经了解了如何:</p>
<ul><li>在鸿蒙应用中嵌入 Flutter 视图</li><li>配置和使用 Flutter 模块</li><li>实现原生鸿蒙与 Flutter 之间的通信</li><li>构建和运行混合应用</li></ul>
<p>这种混合开发模式为开发者提供了更大的灵活性,可以根据项目需求选择最合适的技术栈,同时充分利用 Flutter 的跨平台能力和鸿蒙系统的原生优势。</p>
<p>以上就是Flutter Android View在鸿蒙系统上的使用指南的详细内容,更多关于Flutter Android View鸿蒙系统使用的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>使用PlatformView将 Android 控件view制作成Flutter插件</li><li>Android开发之Flutter与webview通信桥梁实现</li><li>Flutter中嵌入Android 原生TextView实例教程</li><li>android使用flutter的ListView实现滚动列表的示例代码</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Flutter Android View在鸿蒙系统上的使用指南