当前位置: 首页 > article >正文

【Flutter 内嵌 android 原生 View以及相互跳转】

Flutter 内嵌 android 原生 View以及相互跳转

    • 一. 内嵌android 原生View
    • 二、android 与 flutter 相互跳转

一. 内嵌android 原生View

  1. 在android 工程的包名下,也可在MainActivity创建 android 原生view ,继承PlatformView
    // 1.自定义textview
    public static class MyTextView implements PlatformView{

     private TextView textView ;
    
     /**
      *
      * @param context
      * @param messenger 用于消息传递
      * @param id 生成时会分配一个唯一 ID
      * @param maps Flutter 传递的初始化参数。
      */
     public MyTextView(Context context ,BinaryMessenger messenger,int id,Map<String,Object> maps) {
         textView = new TextView(context);
         textView.setText("我是来自android原生的textView");
         if (maps != null){
             String text = maps.get("text").toString();
             textView.setText(text);
         }
    
         textView.setTextColor(Color.RED);
     }
    
     // 返回要嵌入 Flutter 层次结构的Android View
     @Nullable
     @Override
     public View getView() {
         return textView;
     }
    
     //释放此View时调用,此方法调用后 View 不可用,此方法需要清除所有对象引用,否则会造成内存泄漏。
     @Override
     public void dispose() {
    
     }
    

    }

  2. 新建MyViewFactory.java注册PlatformView

public class MyViewFactory extends PlatformViewFactory {
    private final BinaryMessenger messenger;

    public MyViewFactory(BinaryMessenger messenger) {
        super(StandardMessageCodec.INSTANCE);
        this.messenger = messenger;
    }

    @SuppressWarnings("unchecked")
    @Override
    public PlatformView create(Context context, int id, Object args) {
        Map<String, Object> params = (Map<String, Object>) args;
        return new MainActivity.MyTextView(context, messenger, id, params);
    }

}
  1. 创建plugin
public class MyViewFlutterPlugin implements FlutterPlugin {



    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
        BinaryMessenger binaryMessenger = binding.getBinaryMessenger();
        binding.getPlatformViewRegistry().registerViewFactory(
                "plugins.nightfarmer.top/myview",
                new MyViewFactory(binaryMessenger));
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {

    }
}
  1. 在MainActivy 中注册
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        flutterEngine.getPlugins().add(new MyViewFlutterPlugin());
    }
  1. 在flutter 中使用

              Container(
                width: 100,
                height: 100,
                child:  AndroidView(
                  viewType: "plugins.nightfarmer.top/myview",
                  creationParams: {'text':'Flutter传给AndroidTextView的参数'},
                  creationParamsCodec: StandardMessageCodec(),
                ),
              ),

二、android 与 flutter 相互跳转

  1. flutter 挑战到 原生Activity
  var platform = MethodChannel('com.example.flutter/native_channel');

  void goToNativeActivity() {
    platform.invokeMethod('goToNative');
  }

在MainActivty 中注册通道跳转到TestActivity

 private static final String CHANNEL = "com.example.flutter/native_channel";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        flutterEngine.getPlugins().add(new MyViewFlutterPlugin());

        //注册通道
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(
                (call, result) -> {
                    // 接收来自Flutter的方法调用
                    if (call.method.equals("goToNative")) {
                        Intent intent = new Intent(MainActivity.this, TestActivity.class);
                        startActivity(intent);
                        result.success(true);
                    } else {
                        result.notImplemented();
                    }
                }
        );
    }
  1. Activity 中跳转Flutter页面
    在Manifest.xml 中注册
<activity
  android:name="io.flutter.embedding.android.FlutterActivity"
  android:theme="@style/LaunchTheme"
  android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
  android:hardwareAccelerated="true"
  android:windowSoftInputMode="adjustResize"
  />

根据路由跳转到Flutter 页面

        startActivity(
                   FlutterActivity
                       .withNewEngine()
                      .initialRoute("/my_route")
//        .withCachedEngine("engine_id")
                        .build(currentActivity)
       );

跳转会与 2s的黑屏情况,在MyApp中

public class MyApp extends Application {

    private FlutterEngine fe ;

    @Override
    public void onCreate() {
        super.onCreate();

        // 解决原生挑战到 flutter 会有2s 黑屏 的问题
        fe = new FlutterEngine(this);
        fe.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
        FlutterEngineCache.getInstance().put("engine_id",fe);
    }

    //当application 销毁的时候调用
    @Override
    public void onTerminate() {
        //销毁flutter引擎
        fe.destroy();
        super.onTerminate();
    }
}

在清单文件中注册 MyApp

 <application
        android:name="com.qxx.ai_score_manager_flutter.MyApp">

http://www.kler.cn/a/385583.html

相关文章:

  • 【C#设计模式(8)——过滤器模式(Adapter Pattern)】
  • 蓝牙BLE开发——iOS 每次写入数据超过200字节报错?
  • Toeplitz矩阵循环矩阵
  • Springboot整合Prometheus+grafana实现系统监控
  • Day 63 || 拓扑排序、dijkstra
  • 相亲小程序(源码+文档+部署+讲解)
  • ELK实现前台单显示ip/host等日志信息
  • 向日葵远程桌面Visual Studio白屏
  • 如何在Typora中使用copilot
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)本地搜索方案概述
  • 【已解决】Windows11 24H2 (家庭版)无法访问无密码SMB共享的问题;
  • 您与此网站之间建立的连接不安全解决方法
  • Node.js——fs模块-文件删除
  • # VMwareWorkstation虚拟机,如何下载安装 VMware Tools
  • Service Worker 缓存未更新的原因与解决方案
  • 使用 C# `Stopwatch` 实现函数 `Test01`的运行时间计算
  • 无人车之路径规划篇
  • R language 关于二维平面直角坐标系的制作
  • SQL server 列转行
  • 面试题:Spring(一)
  • 密码忘记了,如何取消excel编辑限制?
  • Hue组件相关问题-持续更新
  • 理解Rust 生命周期、所有权和借用机制
  • 运维故障与排查技巧
  • 【JavaEE进阶】导读
  • C++代码优化(二): 区分接口继承和实现继承