Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【Flutter 混合开发】添加 Flutter 到 Android Fragment大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

【Flutter 混合开发】添加 Flutter 到 Android Fragment

使用新引擎创建 @L_675_0@rFragment

添加 @L_675_0@r 到 Fragment 与添加 Activity 基本一样,如果添加到 Activity 满足需求,建议使用 Activity,因为 Activity 更加灵活和易于使用。

添加到 Fragment 代码

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStatE)
        setContentView(R.layout.activity_main)

        val fragment = @L_675_0@rFragment.createDefault()
        supportFragmentManager
            .begintransaction()
            .add(R.id.fragment_container,fragment)
            .commit()
    }
}

activity_main 布局文件修改如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.consTraintlayout.widget.ConsTraintLayout xmlns:android="http://scheR_702_11845@as.android.com/apk/res/android"
    xmlns:app="http://scheR_702_11845@as.android.com/apk/res-auto"
    xmlns:tools="http://scheR_702_11845@as.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_consTraintTop_toTopOf="parent"
        app:layout_consTraintLeft_toLeftOf="parent"
        app:layout_consTraintright_toRightOf="parent"
        app:layout_consTraintBottom_toTopOf="@+id/button"/>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转"
        app:layout_consTraintBottom_toBottomOf="parent"
        app:layout_consTraintLeft_toLeftOf="parent"
        app:layout_consTraintright_toRightOf="parent"/>


</androidx.consTraintlayout.widget.ConsTraintLayout>

【Flutter 混合开发】添加 Flutter 到 Android Fragment

红色区域就是 @L_675_0@rFragment 部分,这里大部分是 Android 原生的知识。

上面已经加载了 UI,但并不能一些交互和行为,通常情况下,需要将 Activity 的生命周期透传给 @L_675_0@rFragment:

class MainActivity : AppCompatActivity() {
  override fun onPostResume() {
    super.onPostResume()
    @L_675_0@rFragment!!.onPostResume()
  }

  override fun onNewIntent(@NonNull intent: Intent) {
    @L_675_0@rFragment!!.onNewIntent(intent)
  }

  override fun onBACkPressed() {
    @L_675_0@rFragment!!.onBACkPressed()
  }

  override fun onrequestPermissionsResult(
    requestCode: Int,permissions: Array<String?>,grantResults: IntArray
  ) {
    @L_675_0@rFragment!!.onrequestPermissionsResult(
      requestCode,permissions,grantResults
    )
  }

  override fun onUserLeaveHint() {
    @L_675_0@rFragment!!.onUserLeaveHint()
  }

  override fun onTrimMemory(level: int) {
    super.onTrimMemory(level)
    @L_675_0@rFragment!!.onTrimMemory(level)
  }
}

初始化新引擎路由

指定引擎路由:

val fragment = @L_675_0@rFragment
    .withNewENGIne()
    .initialRoute("one_page")
    .build<@L_675_0@rFragment>()

supportFragmentManager
    .begintransaction()
    .add(R.id.fragment_container,fragment)
    .commit()

【Flutter 混合开发】添加 Flutter 到 Android Fragment

使用缓存引擎创建 @L_675_0@rFragment

上面的方式每一个 @L_675_0@rFragment 都会创建一个 @L_675_0@rENGIne(@L_675_0@r 引擎),当然 @L_675_0@rFragment 也支持 缓存引擎,用法与 Activity 一样,在 MyApplication 启动引擎:

class MyApplication : Application() {
    lateinit var @L_675_0@rENGIne: @L_675_0@rENGIne

    override fun onCreate() {
        super.onCreate()
        @L_675_0@rENGIne = @L_675_0@rENGIne(this)
        @L_675_0@rENGIne.dartExecutor.executeDartEntrypoint(
            DartExecutor.DartEntrypoint.createDefault()
        )
        @L_675_0@rENGIneCache
            .geTinstance()
            .put("ENGIne_id",@L_675_0@rENGInE)


    }
}

使用:

val fragment = @L_675_0@rFragment
    .withCachedENGIne("ENGIne_id")
    .build<@L_675_0@rFragment>()

supportFragmentManager
    .begintransaction()
    .add(R.id.fragment_container,fragment)
    .commit()

初始化缓存引擎路由

初始化缓存引擎的路由:

@L_675_0@rENGIne = @L_675_0@rENGIne(this)

@L_675_0@rENGIne.navigationChAnnel.seTinitialRoute("one_page")

@L_675_0@rENGIne.dartExecutor.executeDartEntrypoint(
    DartExecutor.DartEntrypoint.createDefault()
)
@L_675_0@rENGIneCache
    .geTinstance()
    .put("ENGIne_id",@L_675_0@rENGInE)

【Flutter 混合开发】添加 Flutter 到 Android Fragment

更改入门点

认情况下,@L_675_0@rFragment 的 entrypoint(入口点)是 @H_629_18@main() 函数,我们可以修改其 entrypoint,

val fragment = @L_675_0@rFragment
    .withNewENGIne()
    .dartEntrypoint("newMain")
    .build<@L_675_0@rFragment>()

在 @H_629_18@main.dart 文件添加 entrypoint(入口点):

void main() => runApp(MyApp());

void newMain()=> runApp(NewApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '@L_675_0@r Demo',theme: ThemeData(

        priMarySwatch: Colors.blue,),routes: {
        'one_page':(context){
          return OnePage();
        },'two_page':(context){
          return TwoPage();
        }
      },home: MyHomePage(title: '@L_675_0@r Demo Home Page'),);
  }
}


class NewApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '@L_675_0@r Demo',home: TwoPage()
    );
  }
}

newMain 即新的 entrypoint。

【Flutter 混合开发】添加 Flutter 到 Android Fragment

更改 @L_675_0@rFragment 的渲染模式

@L_675_0@rFragment 的渲染模式有两种:SurfaceView 和 TextureView,认是 SurfaceView,SurfaceView 的性能比 TextureView 好,但其层次结构必须在最顶层或最底层,而且在 Android N之前的Android版本上,无法对 SurfaceView 进行动画处理,因为它们的布局和渲染与其他 View 层次结构不同步,因此要合理选择渲染模式,渲染模式设置方法如下:

val fragment = @L_675_0@rFragment
    .withNewENGIne()
    .renderMode(RenderMode.texturE)
    .build<@L_675_0@rFragment>()

设置 @L_675_0@rFragment 透明

认情况下,@L_675_0@rFragment 使用 SurfaceView 渲染不透明背景。对于@L_675_0@r未绘制的任何像素,背景均为黑色。由于性能原因,首选使用不透明背景进行渲染。 Android上具有透明的 @L_675_0@r 渲染会对性能产生负面影响。但是,有的时候需要其透明,显示其底下的 UI,因此,@L_675_0@r在 @L_675_0@rFragment 中支持设置为透明。

val fragment = @L_675_0@rFragment
    .withNewENGIne()
    .transparencymode(Transparencymode.transparent)
    .build<@L_675_0@rFragment>()

将按下放置在 @L_675_0@rFragment 的底下,

<?xml version="1.0" encoding="utf-8"?>
<androidx.consTraintlayout.widget.ConsTraintLayout xmlns:android="http://scheR_702_11845@as.android.com/apk/res/android"
    xmlns:app="http://scheR_702_11845@as.android.com/apk/res-auto"
    xmlns:tools="http://scheR_702_11845@as.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转"
        app:layout_consTraintBottom_toBottomOf="parent"
        app:layout_consTraintLeft_toLeftOf="parent"
        app:layout_consTraintright_toRightOf="parent"
        app:layout_consTraintTop_toTopOf="parent"/>


    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_consTraintTop_toTopOf="parent"
        app:layout_consTraintLeft_toLeftOf="parent"
        app:layout_consTraintright_toRightOf="parent"
        app:layout_consTraintBottom_toBottomOf="parent"/>


</androidx.consTraintlayout.widget.ConsTraintLayout>

此时 @L_675_0@rFragment 的背景已经透明了,但运行时发现并没有透明,按钮也没有显示,这是因为 @L_675_0@r 本身没有设置透明,设置@L_675_0@r 透明:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text(widget.titlE),BACkgroundColor: Colors.transparent,...
  );
}

【Flutter 混合开发】添加 Flutter 到 Android Fragment

交流

老孟@L_675_0@r博客(330个控件用法+实战入门系列文章):http://laomengit.com

欢迎加入@L_675_0@r交流群(微信:laomENGIt)、关注公众号【老孟@L_675_0@r】:

【Flutter 混合开发】添加 Flutter 到 Android Fragment

【Flutter 混合开发】添加 Flutter 到 Android Fragment

大佬总结

以上是大佬教程为你收集整理的【Flutter 混合开发】添加 Flutter 到 Android Fragment全部内容,希望文章能够帮你解决【Flutter 混合开发】添加 Flutter 到 Android Fragment所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: