当前位置:   article > 正文

Flutter 使用AndroidStudio并集成Flutter界面_android studio flutter

android studio flutter

AndroidStudio项目中集成Flutter

需先到项目工程中集成flutter module。然后,通过原生Android的Activity跳转或addView()方式打开flutter页面。


AS创建module

菜单选项  →  File -> New -> New Flutter Project -> Flutter Module; 


Android Project 中添加依赖

如果第1步比较顺利,默认工程会自动配置依赖。

如果没有默认配置,那需要手动配置一下,参考如下。

(1)在 setting.gradle 中加入 Flutter 的引入;

  1. include ':app'
  2. setBinding(new Binding([gradle: this]))
  3. evaluate(new File(
  4. settingsDir,
  5. 'flutter_view/.android/include_flutter.groovy'
  6. ))
  7. include ':flutter_view'

(2)在app/build.project 中添加 Flutter 依赖;

  1. dependencies{
  2. implementation project(path: ':flutter')
  3. }

(3)在app/build.project 中指定JDK1.8,且最低版本在 16 以上;

  1. android {
  2. defaultConfig {//版本号...minSdkVersion >= 16}
  3. compileOptions {
  4. sourceCompatibility JavaVersion.VERSION_1_8
  5. targetCompatibility JavaVersion.VERSION_1_8
  6. }
  7. }

Flutter两种方式打开

一种是在原生里页面内添加View页面(FlutterView和FlutterFragment),另外一种是在原生页面跳转打开FlutterActivity。

FlutterEngine引擎 :它负责执行Dart代码,将Flutter编写的UI显示到FlutterView或FlutterActivity或FlutterFragment中。创建好了一个FlutterEngine对象,我们可以通过代码指定初始路由名称。另外,每个FlutterEngine对象在显示出Flutter UI之前是需要一个warm-up准备期的,导致屏幕呈现短暂的空白。解决方式就是预先创建并启动FlutterEngine,完成warm-up过程,然后将这个FlutterEngine缓存起来,之后使用这个FlutterEngine来显示出Flutter UI。 

FlutterView

  1. public class MyActivity extends AppCompatActivity {
  2. FlutterEngine flutterEngine;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.mylayout);
  7. createEngine();
  8. openFlutterView();
  9. }
  10. private void createEngine(){
  11. flutterEngine = new FlutterEngine(this);
  12. flutterEngine.getDartExecutor().executeDartEntrypoint(
  13. DartExecutor.DartEntrypoint.createDefault()
  14. );
  15. flutterEngine.getNavigationChannel().setInitialRoute("route1");//指定路由
  16. }
  17. private void openFlutterView(){
  18. FlutterView flutterView = new FlutterView(this);
  19. FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
  20. ViewGroup.LayoutParams.MATCH_PARENT,
  21. ViewGroup.LayoutParams.MATCH_PARENT);
  22. FrameLayout flContainer = findViewById(R.id.flutter_view);
  23. flContainer.addView(flutterView, lp);
  24. flutterView.attachToFlutterEngine(flutterEngine);
  25. }
  26. @Override
  27. protected void onResume() {
  28. super.onResume();
  29. flutterEngine.getLifecycleChannel().appIsResumed();
  30. }
  31. @Override
  32. protected void onPause() {
  33. super.onPause();
  34. flutterEngine.getLifecycleChannel().appIsInactive();
  35. }
  36. @Override
  37. protected void onStop() {
  38. super.onStop();
  39. flutterEngine.getLifecycleChannel().appIsPaused();
  40. }

FlutterFragment

官方提供了三种创建FlutterFragment的方式:

  1. private void openFlutterFragment() {
  2. FlutterFragment flutterFragment = FlutterFragment.createDefault();
  3. getSupportFragmentManager()
  4. .beginTransaction()
  5. .add(R.id.fl_container, flutterFragment)
  6. .commit();
  7. //或者
  8. FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
  9. FlutterFragment fragment = FlutterFragment.withNewEngine().initialRoute("route1").build();
  10. tx.replace(R.id.flutter_view, fragment);
  11. tx.commit();
  12. }
  1. // 创建可缓存的FlutterEngine对象
  2. FlutterEngine flutterEngine = new FlutterEngine(this);
  3. flutterEngine.getNavigationChannel().setInitialRoute("route1");
  4. flutterEngine.getDartExecutor().executeDartEntrypoint(
  5. DartExecutor.DartEntrypoint.createDefault()
  6. );
  7. FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);
  8. // 通过FlutterFragment引入Flutter编写的页面
  9. FlutterFragment flutterFragment = FlutterFragment.withCachedEngine("my_engine_id").build();

原生Activity跳转Flutter界面

首先,需要在工程下的AndroidManifest.xml文件中注册FlutterActivity,代码如下:

  1. <activity
  2. android:name="io.flutter.embedding.android.FlutterActivity"
  3. android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
  4. android:hardwareAccelerated="true"
  5. android:theme="@style/AppTheme"
  6. android:windowSoftInputMode="adjustResize" />

三种启动方式:

1 、FutterActivity默认路由名称为"/",默认打开main.dart的main方法。

  1. startActivity(
  2. FlutterActivity.createDefaultIntent(this)
  3. );

2、FutterActivity路由名称为“route1”,创建一个新的FlutterEngine对象

  1. startActivity(
  2.         FlutterActivity
  3.                 .withNewEngine()
  4.                 .initialRoute("route1")
  5.                 .build(this)
  6. );

3、FutterActivity 使用缓存的引擎对象(主流推荐

  1. startActivity(
  2. // 创建可缓存的FlutterEngine对象
  3. FlutterEngine flutterEngine = new FlutterEngine(this);
  4. flutterEngine.getDartExecutor().executeDartEntrypoint(
  5. DartExecutor.DartEntrypoint.createDefault()
  6. );
  7. flutterEngine.getNavigationChannel().setInitialRoute("route1");
  8. FlutterEngineCache.getInstance().put("engine_id", flutterEngine);
  9.     FlutterActivity
  10.         .withCachedEngine("engine_id")
  11.         .build(this)
  12. );

跳转Flutter带参数

通常情况下,我们需要在页面跳转时传递参数完成一些业务功能。那么,如何在Flutter代码中获取到原生代码中的参数呢?

只需要在route地址后缀拼接参数就可以了。代码示例如下:

  1. private void createEngine(){
  2. flutterEngine = new FlutterEngine(this);
  3. flutterEngine.getDartExecutor().executeDartEntrypoint(
  4. DartExecutor.DartEntrypoint.createDefault()
  5. );
  6. flutterEngine.getNavigationChannel().
  7. setInitialRoute("route1?{\"id\":123456}");//指定路由
  8. }

在flutter页面代码:

  1. String url = window.defaultRouteName;
  2. // route名称
  3. String route =
  4. url.indexOf('?') == -1 ? url : url.substring(0, url.indexOf('?'));
  5. // 参数Json字符串
  6. String paramsJson =
  7. url.indexOf('?') == -1 ? '{}' : url.substring(url.indexOf('?') + 1);
  8. // 解析参数
  9. Map<String, dynamic> params = json.decode(paramsJson);

*参数就在Map对象中了,需要导入dart:convert包。


至此,原生Android项目中集成Flutter的混编算是迈出了最重要的一步。

下一篇,学习从Flutter界面跳转到其他原生Activity页面通讯。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/810124
推荐阅读
相关标签
  

闽ICP备14008679号