前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原有Android项目中体验Flutter

原有Android项目中体验Flutter

作者头像
前端小鑫同学
发布2022-12-24 11:01:46
3300
发布2022-12-24 11:01:46
举报
1. 手动整合Flutter到Android项目

Flutter支持x86_64,armeabi-v7a,arm64-v8a

代码语言:javascript
复制
android {
  //...
  defaultConfig {
    ndk {
      // Filter for architectures supported by Flutter.
      // 如果使用Android模拟器测试请添加'x86'平台
      abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
    }
  }
}

java8支持

代码语言:javascript
复制
android {
  //...
  compileOptions {
    sourceCompatibility 1.8
    targetCompatibility 1.8
  }
}

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

配置settings.gradle

代码语言:javascript
复制
// 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

为Android项目依赖Flutter模块

代码语言:javascript
复制
dependencies {
  implementation project(':flutter')
}

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

2. 在Activity中启动Flutter页面

注册FlutterActivity到清单文件

代码语言:javascript
复制
<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"
/>

启动FlutterActivity

代码语言:javascript
复制
//打开首页
startActivity(
  FlutterActivity.createDefaultIntent(currentActivity)
);

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

引入FlutterEngine加快启动

代码语言:javascript
复制
//初始化FlutterEngine并进行缓存
FlutterEngine flutterEngine = new FlutterEngine(this);
flutterEngine.getDartExecutor().executeDartEntrypoint(
        DartExecutor.DartEntrypoint.createDefault()
);
FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);
代码语言:javascript
复制
//改变启动方式
startActivity(
    FlutterActivity.withCachedEngine("my_engine_id").build(MainActivity.this);
);

引入FlutterEngine时初始化路由

代码语言:javascript
复制
在创建flutterEngine对象后插入如下内容:
flutterEngine.getNavigationChannel().setInitialRoute("/other");
3. 在Activity中加载Flutter页面

布局文件添加代码

代码语言:javascript
复制
<FrameLayout
    android:layout_weight="1"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在Activity中添加代码

代码语言:javascript
复制
// 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;
代码语言:javascript
复制
// 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();
    }
代码语言:javascript
复制
@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);
}

使用FlutterFragment.withCachedEngine("my_engine_id").build();加速启动

代码语言:javascript
复制
if (flutterFragment == null) {
    flutterFragment = FlutterFragment.withCachedEngine("my_engine_id").build();
    fragmentManager
            .beginTransaction()
            .add(
                    R.id.fragment_container,
                    flutterFragment,
                    TAG_FLUTTER_FRAGMENT
            )
            .commit();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 手动整合Flutter到Android项目
  • 2. 在Activity中启动Flutter页面
  • 3. 在Activity中加载Flutter页面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档