美文网首页
Android kotlin项目导入flutter项目,各种问题

Android kotlin项目导入flutter项目,各种问题

作者: 职场过客 | 来源:发表于2022-06-27 18:49 被阅读0次

    Android studio版本:chipmunk-2021.2.1 patch 1 (部分功能区别于Android studio 4.2)
    flutter 版本:2.8.0
    java版本 :jdk-11.0.14

    一.创建

    使用Android Studio来创建,依次点击左上角的File --> New --> New Flutter Project,然后选择Flutter。

    创建一.png
    点击next 后在编辑以下数值
    创建二.png
    备注:\color{red}{flutter文件最好放在项目的目录中,方便调试和后面的引入}
    二.引入
    (1)然后在项目根目录下的setting.gradle文件中配置:
    setBinding(new Binding([gradle:this]))
    //flutter目录
    evaluate(new File(
    settingsDir.parentFile,
    'element-android-naya/my_flutter/.android/include_flutter.groovy'
    
    ))
    
    错误一:setBinding(new Binding([gradle: this]))报错
    错误.png

    错误原因:当前gradle版本中缺少groovy-all.jar包导致的,目前项目是gradle-7.4.2-all.zip
    解决:从C:\Users\sir.gradle\wrapper\dists\gradle-6.7-all\cuy9mc7upwgwgeb72wkcrupxe\gradle-6.7\lib下复制groovy-all-1.3-2.5.12.jar到C:\Users\sir.gradle\wrapper\dists\gradle-7.4.2-all\9uukhhbclvbegdvsww0j0cr3p\gradle-7.4.2\lib下;然后重新打开项目即可

    错误二:

    Caused by: java.lang.AssertionError: Project :app doesn't exist. To custom the host app project name, set org.gradle.project.flutter.hostAppProjectName=<project-name> in gradle.properties.. Expression: (appProject != null). Values: appProject = null

    错误二.png
    原因:你的android项目的主module的名字不是app,官方解释:https://flutter.cn/docs/development/add-to-app/android/project-setup
    解决:
    在android项目的gradle.properties文件中设置 flutter.hostAppProjectName:
    flutter.hostAppProjectName = app_name
    其中app_name就是你android项目主module的名字(也是文件夹的名字)。
    (2) 在build.gradle中添加
     implementation project(':flutter')
    
    (3) 在AndroidManifest.xml文件中添加
    
          <activity
                android:name=".features.FlutterPageActivity"
                android:theme="@style/FlutterPageTheme"
                android:exported="false" />
    
       <activity
                android:name="io.flutter.embedding.android.FlutterActivity"
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
                android:hardwareAccelerated="true"
                android:theme="@style/AppTheme"
                android:windowSoftInputMode="adjustResize" />
    
    

    具体代码:

    package im.myapp.app.features;
    import android.content.Intent;
    import androidx.annotation.Nullable;
    import java.util.HashMap;
    import java.util.Map;
    import io.flutter.embedding.android.FlutterActivity;
    import io.flutter.embedding.android.FlutterView;
    import io.flutter.embedding.engine.FlutterEngine;
    import io.flutter.embedding.engine.FlutterEngineCache;
    import io.flutter.embedding.engine.dart.DartExecutor;
    import io.flutter.plugin.common.MethodChannel;
    import io.flutter.plugins.GeneratedPluginRegistrant;
    
    public class FlutterPageActivity extends FlutterActivity {
        private FlutterEngine flutterEngine;
        private FlutterView flutterView;
        private static final String CHANNEL_NATIVE = "com.page/element";
        private static final String CHANNEL_FLUTTER = "com.element/flutter";
        private MethodChannel methodChannel;
        @Override
        public void configureFlutterEngine(FlutterEngine mflutterEngine) {
    
            flutterEngine = mflutterEngine;
            // 设置初始路由
             flutterEngine.getNavigationChannel().setInitialRoute("rupt_msg?{\"action\":\"" + getIntent().getStringExtra("action") + "\",\"weburl\":\"" + getIntent().getStringExtra("weburl") + "\"}");
            //注册
            GeneratedPluginRegistrant.registerWith(flutterEngine);
            // 开始执行dart代码来pre-warm FlutterEngine
            flutterEngine.getDartExecutor().executeDartEntrypoint(
                    DartExecutor.DartEntrypoint.createDefault()
            );
            // 缓存FlutterEngine
            FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);
            methodChannel = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL_NATIVE);
            methodChannel.setMethodCallHandler((methodCall, result) -> {
                switch (methodCall.method) {
                    case "goBack":
                        finish();
                    case "saveBack": //缓存点击事件
                        setResult(RESULT_OK);
                        break;
                    default:
                        result.notImplemented();
                        break;
                }
            });
        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 0 && resultCode == RESULT_OK) {
                if (data != null) {
                    String message = data.getStringExtra("message");
                    Map<String, Object> result = new HashMap<>();
                    result.put("message", message);
                    // 创建MethodChannel
                    MethodChannel flutterChannel = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL_FLUTTER);
                    flutterChannel.invokeMethod("onActivityResult", result);
                }
            }
        }
        @Override
        public void onBackPressed() {
            MethodChannel flutterChannel = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL_FLUTTER);
            flutterChannel.invokeMethod("goBack", null);
        }
        @Override
        protected void onResume() {
            super.onResume();
            flutterEngine.getLifecycleChannel().appIsResumed();
        }
        @Override
        protected void onPause() {
            super.onPause();
            flutterEngine.getLifecycleChannel().appIsInactive();
        }
        @Override
        protected void onStop() {
            super.onStop();
            flutterEngine.getLifecycleChannel().appIsPaused();
        }
    }
    

    完美运行!!!
    如果要Android java项目导入flutter项目的话,请参考
    https://www.jianshu.com/p/dd882301670d

    相关文章

      网友评论

          本文标题:Android kotlin项目导入flutter项目,各种问题

          本文链接:https://www.haomeiwen.com/subject/mlxovrtx.html