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

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

    • [一. 内嵌android 原生View](#一. 内嵌android 原生View)
    • [二、android 与 flutter 相互跳转](#二、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

java 复制代码
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
java 复制代码
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 中注册
java 复制代码
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        flutterEngine.getPlugins().add(new MyViewFlutterPlugin());
    }
  1. 在flutter 中使用
dart 复制代码
              Container(
                width: 100,
                height: 100,
                child:  AndroidView(
                  viewType: "plugins.nightfarmer.top/myview",
                  creationParams: {'text':'Flutter传给AndroidTextView的参数'},
                  creationParamsCodec: StandardMessageCodec(),
                ),
              ),

二、android 与 flutter 相互跳转

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

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

在MainActivty 中注册通道跳转到TestActivity

java 复制代码
 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 中注册
java 复制代码
<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 页面

java 复制代码
        startActivity(
                   FlutterActivity
                       .withNewEngine()
                      .initialRoute("/my_route")
//        .withCachedEngine("engine_id")
                        .build(currentActivity)
       );

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

java 复制代码
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

java 复制代码
 <application
        android:name="com.qxx.ai_score_manager_flutter.MyApp">
相关推荐
七月.末33 分钟前
安卓aab包的安装教程,附带adb环境的配置
android·adb
SRC_BLUE_176 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道9 小时前
Android打包流程图
android
镭封10 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰48711 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛11 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二11 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫11 小时前
Android开发中的隐藏控件技巧
android
Winston Wood13 小时前
Android中Activity启动的模式
android
众乐认证13 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto