当前位置: 首页 > news >正文

FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践

在 Flutter 混合开发中,选择合适的 Activity 基类至关重要。本文将深入分析 FlutterActivity 和 FlutterFragmentActivity 的区别,并介绍如何集成 ViewModel 等常用功能。

  1. 核心类关系图
Activity│├── FlutterActivity (直接继承)│└── ComponentActivity│└── FragmentActivity│└── FlutterFragmentActivity│├── ViewModel 支持├── LiveData 观察├── Fragment 管理└── AppCompat 功能
  1. 基础特性对比

特性 FlutterActivity FlutterFragmentActivity
继承关系 → Activity → FragmentActivity → ComponentActivity
ViewModel 需要额外配置 ✅ 原生支持
LiveData 需要手动处理 ✅ 自动生命周期感知
Fragment ❌ 不支持 ✅ 完整支持
AppCompat ❌ 不支持 ✅ Material Design
主题样式 受限 完整 AppCompat 主题
生命周期 简单 完整的生命周期管理
使用复杂度 简单 中等

  1. ViewModel 集成方案

FlutterActivity 中的 ViewModel 集成

class FlutterActivityWithViewModel : FlutterActivity() {// 需要手动管理 ViewModelprivate lateinit var viewModel: MainViewModeloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 手动创建 ViewModelviewModel = ViewModelProvider(ViewModelStore(),ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)setupChannels()}private fun setupChannels() {val channel = MethodChannel(flutterEngine?.dartExecutor, "app_channel")channel.setMethodCallHandler { call, result ->when (call.method) {"getData" -> result.success(viewModel.getData())else -> result.notImplemented()}}}// 需要手动处理生命周期override fun onDestroy() {super.onDestroy()// 清理资源}
}

FlutterFragmentActivity 中的 ViewModel 集成

class AdvancedFlutterActivity : FlutterFragmentActivity() {// 使用委托自动管理 ViewModelprivate val viewModel: MainViewModel by viewModels()private val sharedViewModel: SharedViewModel by viewModels()private lateinit var methodChannel: MethodChanneloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_hybrid)setupFlutterFragment()setupChannels()observeViewModels()setupActionBar()}private fun setupFlutterFragment() {val flutterFragment = FlutterFragment.createDefault()supportFragmentManager.beginTransaction().replace(R.id.flutter_container, flutterFragment).commit()}private fun setupChannels() {methodChannel = MethodChannel(flutterEngine.dartExecutor, "app_channel")methodChannel.setMethodCallHandler { call, result ->handleMethodCall(call, result)}}private fun handleMethodCall(call: MethodCall, result: Result) {when (call.method) {"getUserInfo" -> result.success(viewModel.userInfo.value)"updateSettings" -> viewModel.updateSettings(call.arguments)"getAppState" -> result.success(sharedViewModel.appState.value)else -> result.notImplemented()}}private fun observeViewModels() {// 自动生命周期感知的 LiveData 观察viewModel.userInfo.observe(this) { userInfo ->sendToFlutter("userInfoUpdate", userInfo)}viewModel.settings.observe(this) { settings ->updateUI(settings)}sharedViewModel.appState.observe(this) { state ->handleAppStateChange(state)}}private fun setupActionBar() {setSupportActionBar(findViewById(R.id.toolbar))supportActionBar?.title = "混合应用"}private fun sendToFlutter(method: String, data: Any) {methodChannel.invokeMethod(method, data)}
}
  1. ViewModel 类示例
class MainViewModel(application: Application) : AndroidViewModel(application) {private val _userInfo = MutableLiveData<UserInfo>()val userInfo: LiveData<UserInfo> = _userInfoprivate val _settings = MutableLiveData<Settings>()val settings: LiveData<Settings> = _settingsprivate val _loading = MutableLiveData<Boolean>()val loading: LiveData<Boolean> = _loadinginit {loadInitialData()}fun updateUserInfo(newInfo: UserInfo) {_userInfo.value = newInfo// 可以在这里添加业务逻辑,如API调用}fun updateSettings(settings: Map<String, Any>) {// 处理设置更新_settings.value = convertToSettings(settings)}fun performAction(action: String) {viewModelScope.launch {_loading.value = truetry {val result = repository.performAction(action)_userInfo.value = result} catch (e: Exception) {// 错误处理} finally {_loading.value = false}}}override fun onCleared() {super.onCleared()// 清理资源}
}// 共享 ViewModel
class SharedViewModel : ViewModel() {val appState = MutableLiveData<AppState>()val navigation = MutableLiveData<NavigationEvent>()
}
  1. 常用功能集成对比

导航处理

FlutterActivity:

// 简单的 Intent 导航
startActivity(FlutterActivity.withNewEngine().build(this))

FlutterFragmentActivity:

// 复杂的 Fragment 导航
fun navigateToFlutter() {supportFragmentManager.beginTransaction().replace(R.id.container, FlutterFragment.createDefault()).addToBackStack("flutter").commit()
}// 处理返回键
override fun onBackPressed() {if (supportFragmentManager.backStackEntryCount > 0) {supportFragmentManager.popBackStack()} else {super.onBackPressed()}
}

主题和样式

FlutterActivity (受限):

<style name="FlutterTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowBackground">@drawable/launch_background</item>
</style>

FlutterFragmentActivity (完整):

<style name="AppTheme" parent="Theme.Material3.DayNight"><item name="colorPrimary">@color/primary</item><item name="colorSecondary">@color/secondary</item><item name="android:statusBarColor">@color/primaryDark</item><item name="actionBarTheme">@style/MyActionBar</item><item name="bottomNavigationStyle">@style/BottomNavigation</item>
</style>

状态管理

FlutterActivity (手动管理):

class SimpleStateManager {private var states = mutableMapOf<String, Any>()fun saveState(key: String, value: Any) {states[key] = value}fun getState(key: String): Any? = states[key]
}

FlutterFragmentActivity (使用 ViewModel):

// 自动状态持久化
class StateViewModel : ViewModel() {private val _state = mutableStateFlow<AppState>(AppState.Idle)val state: StateFlow<AppState> = _statefun updateState(newState: AppState) {_state.value = newState}
}
  1. 性能与内存考量

方面 FlutterActivity FlutterFragmentActivity
启动性能 ⚡️ 更快 (~100ms) ⏳ 稍慢 (~150ms)
内存占用 📉 较低 (~30MB) 📈 较高 (~45MB)
渲染性能 🎯 优化更好 🔧 需要调优
生命周期 🟢 简单 🟡 复杂但完整

  1. 实际项目架构建议

方案一:纯 Flutter 应用

// 使用 FlutterActivity 作为主要入口
class MainActivity : FlutterActivity() {// 简单配置,快速启动
}// 配置 AndroidManifest.xml
<activity android:name=".MainActivity"><meta-data android:name="io.flutter.embedding.android.NormalTheme"android:resource="@style/FlutterTheme"/>
</activity>

方案二:混合开发应用

// 使用 FlutterFragmentActivity 作为基础
class HybridAppActivity : FlutterFragmentActivity() {private val viewModel: AppViewModel by viewModels()private val authViewModel: AuthViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_hybrid)setupFragments()setupViewModels()setupNavigation()setupChannels()}private fun setupFragments() {// 管理多个 Fragmentval navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host) as NavHostFragmentnavController = navHostFragment.navController}private fun setupViewModels() {// 观察多个 ViewModelviewModel.userData.observe(this) { updateUserUI(it) }authViewModel.authState.observe(this) { handleAuthState(it) }}private fun setupNavigation() {// 设置底部导航bottomNavigation.setupWithNavController(navController)}private fun setupChannels() {// 设置 Flutter 通信MethodChannel(flutterEngine.dartExecutor, "app_channel").apply {setMethodCallHandler { call, result ->when (call.method) {"nativeFunction" -> handleNativeCall(call, result)else -> result.notImplemented()}}}}
}
  1. 迁移指南

从 FlutterActivity 迁移到 FlutterFragmentActivity

  1. 修改继承关系
// 之前
class MyActivity : FlutterActivity()// 之后
class MyActivity : FlutterFragmentActivity()
  1. 添加布局文件
<!-- res/layout/activity_main.xml -->
<LinearLayout><androidx.appcompat.widget.Toolbar/><FrameLayout android:id="@+id/flutter_container"/>
</LinearLayout>
  1. 初始化 Fragment
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)supportFragmentManager.beginTransaction().replace(R.id.flutter_container, FlutterFragment.createDefault()).commit()
}
  1. 集成 ViewModel
private val viewModel: MyViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 观察 LiveDataviewModel.data.observe(this) { updateUI(it) }
}
  1. 最佳实践总结

选择 FlutterActivity 当:

· ✅ 开发纯 Flutter 应用
· ✅ 需要最快的启动速度
· ✅ 项目结构简单
· ✅ 不需要原生 UI 组件

选择 FlutterFragmentActivity 当:

· ✅ 需要混合开发
· ✅ 使用 ViewModel 和 LiveData
· ✅ 需要 Fragment 管理
· ✅ 集成原生 Android 功能
· ✅ 需要完整的主题支持

推荐架构:

FlutterFragmentActivity├── ViewModel (业务逻辑)├── LiveData (状态管理)├── Fragment (UI 管理)├── DataBinding (可选)└── Navigation Component (导航)

结论

FlutterActivity 适合简单的纯 Flutter 应用,而 FlutterFragmentActivity 为混合开发提供了完整的 Android 架构组件支持。在选择时,应考虑项目的复杂度、团队的技术栈和长期维护需求。对于大多数企业级应用,推荐使用 FlutterFragmentActivity 以获得更好的可扩展性和维护性。


文章转载自:

http://BEZ7ifgD.zztmk.cn
http://z2ob2ibA.zztmk.cn
http://2Lkw35dD.zztmk.cn
http://23CuBhkd.zztmk.cn
http://yaheA9v4.zztmk.cn
http://2Anp7sjV.zztmk.cn
http://Omn0FGo2.zztmk.cn
http://pxNyXzHG.zztmk.cn
http://W24NW3qv.zztmk.cn
http://nF8BOzm6.zztmk.cn
http://JY8GD8E4.zztmk.cn
http://lQTaYgbv.zztmk.cn
http://MFQBCl8i.zztmk.cn
http://uWndX25C.zztmk.cn
http://AeYQW65m.zztmk.cn
http://FKaJ7tIj.zztmk.cn
http://506icnjx.zztmk.cn
http://gzfKupTQ.zztmk.cn
http://jsXmF7Pc.zztmk.cn
http://ayJNUexQ.zztmk.cn
http://aAh2Q5uj.zztmk.cn
http://zb6eFXdF.zztmk.cn
http://Hff4dGUf.zztmk.cn
http://T2zJQBGD.zztmk.cn
http://MLAc1b1s.zztmk.cn
http://y5G1vrIG.zztmk.cn
http://voEspzS2.zztmk.cn
http://RrU4N7Mf.zztmk.cn
http://wptFIcj9.zztmk.cn
http://HDsc1ugy.zztmk.cn
http://www.dtcms.com/a/372924.html

相关文章:

  • 算法高频题
  • Aider AI Coding 项目 LLM 模型管理 深度分析
  • Spring事件监听机制(三)
  • 设计模式之单例模式大全---java实现
  • Separated collaborative learning
  • Microsoft Visual C++ 运行库安装教程(最新版完整指南 | DLL修复方案)
  • 【Linux】vim工具篇
  • 迁移学习:人工智能的智慧传承与革新之道
  • SQL面试题及详细答案150道(116-135) --- 高级查询与函数篇
  • LRU 缓存
  • Redis的Feed流实现方案
  • 5G专网、物联网专业技术知识
  • LaTeX TeX Live 安装与 CTAN 国内镜像配置(Windows / macOS / Linux 全流程)
  • 脑电数据预处理十六:自动化阈值检测原理与实践
  • 9月8日
  • Java全栈开发工程师的实战面试经历:从基础到微服务
  • 冰火岛 Tech 传:Apple Foundation Models 心法解密(上集)
  • 腾讯云 CLB (Cloud Load Balancer) 为例,详细讲解如何配置 Nginx 集群
  • 25.线程概念和控制(二)
  • VMware-三种网络模式原理
  • 【Java实战㉝】Spring Boot实战:从入门到自动配置的进阶之路
  • 【WRF-VPRM 预处理器第一期】完整安装(服务器)
  • 【Unity笔记】Unity 编辑器扩展:打造一个可切换 Config.assets 的顶部菜单插件
  • Visual Studio Code设置个性化背景教程
  • AI内容标识新规实施后,大厂AI用户协议有何变化?(二)百度系
  • 【大模型应用开发 5.LlamaIndex知识管理与信息检索】
  • 打开SOLIDWORKS非常缓慢的测试排查方法
  • 《Redis Cluster 去中心化实战指南:从集群搭建、故障转移到扩缩容全流程》
  • 大厂的服务器自动扩缩容
  • 02OpenCV基本操作