原有Android项目中体验Flutter

简介: 原有Android项目中体验Flutter

1. 手动整合Flutter到Android项目


  1. Flutter支持x86_64,armeabi-v7a,arm64-v8a
android {
  //...
  defaultConfig {
    ndk {
      // Filter for architectures supported by Flutter.
      // 如果使用Android模拟器测试请添加'x86'平台
      abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
    }
  }
}


  1. java8支持
android {
  //...
  compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
  }
}


  1. 在现有Android项目的同级目录执行创建Flutter项目的命令flutter create -t module --org cn.it200 my_flutter


  1. 配置settings.gradle
// Include the host app project.
include ':app'                                    // assumed existing content
setBinding(new Binding([gradle: this]))                                // new
evaluate(new File(                                                     // new
  settingsDir.parentFile,                                              // new
  'my_flutter/.android/include_flutter.groovy'                         // new
))                                                                     // new


  1. 为Android项目依赖Flutter模块
dependencies {
  implementation project(':flutter')
}


  1. 在Java代码中可以正常导入Flutter相关包,编译项目无异常


2. 在Activity中启动Flutter页面


  1. 注册FlutterActivity到清单文件
<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"
/>


  1. 启动FlutterActivity
//打开首页
startActivity(
  FlutterActivity.createDefaultIntent(currentActivity)
);
//根据路由打开指定页面
startActivity(
        FlutterActivity
                .withNewEngine()
                .initialRoute("/other")
                .build(MainActivity.this)
);


  1. 引入FlutterEngine加快启动
//初始化FlutterEngine并进行缓存
FlutterEngine flutterEngine = new FlutterEngine(this);
flutterEngine.getDartExecutor().executeDartEntrypoint(
        DartExecutor.DartEntrypoint.createDefault()
);
FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);
//改变启动方式
startActivity(
    FlutterActivity.withCachedEngine("my_engine_id").build(MainActivity.this);
);


  1. 引入FlutterEngine时初始化路由
在创建flutterEngine对象后插入如下内容:
flutterEngine.getNavigationChannel().setInitialRoute("/other");



3. 在Activity中加载Flutter页面


  1. 布局文件添加代码
<FrameLayout
    android:layout_weight="1"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


  1. 在Activity中添加代码
// Define a tag String to represent the FlutterFragment within this
// Activity's FragmentManager. This value can be whatever you'd like.
private static final String TAG_FLUTTER_FRAGMENT = "flutter_fragment";
// Declare a local variable to reference the FlutterFragment so that you
// can forward calls to it later.
private FlutterFragment flutterFragment;


// Get a reference to the Activity's FragmentManager to add a new
    // FlutterFragment, or find an existing one.
    FragmentManager fragmentManager = getSupportFragmentManager();
    // Attempt to find an existing FlutterFragment,
    // in case this is not the first time that onCreate() was run.
    flutterFragment = (FlutterFragment) fragmentManager
            .findFragmentByTag(TAG_FLUTTER_FRAGMENT);
    // Create and attach a FlutterFragment if one does not exist.
    if (flutterFragment == null) {
        flutterFragment = FlutterFragment.createDefault();
        fragmentManager
                .beginTransaction()
                .add(
                        R.id.fragment_container,
                        flutterFragment,
                        TAG_FLUTTER_FRAGMENT
                )
                .commit();
    }


@Override
public void onPostResume() {
    super.onPostResume();
    flutterFragment.onPostResume();
}
@Override
protected void onNewIntent(@NonNull Intent intent) {
    super.onNewIntent(intent);
    flutterFragment.onNewIntent(intent);
}
@Override
public void onBackPressed() {
    flutterFragment.onBackPressed();
}
@Override
public void onRequestPermissionsResult(
        int requestCode,
        @NonNull String[] permissions,
        @NonNull int[] grantResults
) {
    flutterFragment.onRequestPermissionsResult(
            requestCode,
            permissions,
            grantResults
    );
}
@Override
public void onUserLeaveHint() {
    flutterFragment.onUserLeaveHint();
}
@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    flutterFragment.onTrimMemory(level);
}


  1. 使用FlutterFragment.withCachedEngine("my_engine_id").build();加速启动
if (flutterFragment == null) {
    flutterFragment = FlutterFragment.withCachedEngine("my_engine_id").build();
    fragmentManager
            .beginTransaction()
            .add(
                    R.id.fragment_container,
                    flutterFragment,
                    TAG_FLUTTER_FRAGMENT
            )
            .commit();
}



相关文章
|
7月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
317 64
|
7月前
|
开发工具 Android开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
1697 61
|
2月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
264 8
|
2月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
152 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
2月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
177 6
|
7月前
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
413 64
|
7月前
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
1209 62
|
7月前
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
424 61
|
9月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1072 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
9月前
|
开发工具 Android开发 iOS开发
零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
OpenIM 为开发者提供开源即时通讯 SDK,作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM,开发者可以构建安全可靠的即时通讯应用,如 WeChat、Zoom、Slack 等。 本仓库基于开源版 OpenIM SDK 开发,提供了一款基于 Flutter 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。 开发环境 在开始开发之前,请确保您的系统已安装以下软件: 操作系统:macOS 14.6 或更高版本 Flutter:版本 3.24.5(根据官网步骤进行安装) Git:用于代码版本控制 同时,您需要确保已经部署了最
597 10

热门文章

最新文章