在 Flutter 混合开发中,选择合适的 Activity 基类至关重要。本文将深入分析 FlutterActivity 和 FlutterFragmentActivity 的区别,并介绍如何集成 ViewModel 等常用功能。
-
核心类关系图
Activity
│
├── FlutterActivity (直接继承)
│
└── ComponentActivity
│
└── FragmentActivity
│
└── FlutterFragmentActivity
│
├── ViewModel 支持
├── LiveData 观察
├── Fragment 管理
└── AppCompat 功能 -
基础特性对比
特性 FlutterActivity FlutterFragmentActivity
继承关系 → Activity → FragmentActivity → ComponentActivity
ViewModel 需要额外配置 ✅ 原生支持
LiveData 需要手动处理 ✅ 自动生命周期感知
Fragment ❌ 不支持 ✅ 完整支持
AppCompat ❌ 不支持 ✅ Material Design
主题样式 受限 完整 AppCompat 主题
生命周期 简单 完整的生命周期管理
使用复杂度 简单 中等
- ViewModel 集成方案
FlutterActivity 中的 ViewModel 集成
kotlin
class FlutterActivityWithViewModel : FlutterActivity() {
// 需要手动管理 ViewModel
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 手动创建 ViewModel
viewModel = 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 集成
kotlin
class AdvancedFlutterActivity : FlutterFragmentActivity() {
// 使用委托自动管理 ViewModel
private val viewModel: MainViewModel by viewModels()
private val sharedViewModel: SharedViewModel by viewModels()
private lateinit var methodChannel: MethodChannel
override 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)
}
}
- ViewModel 类示例
kotlin
class MainViewModel(application: Application) : AndroidViewModel(application) {
private val _userInfo = MutableLiveData<UserInfo>()
val userInfo: LiveData<UserInfo> = _userInfo
private val _settings = MutableLiveData<Settings>()
val settings: LiveData<Settings> = _settings
private val _loading = MutableLiveData<Boolean>()
val loading: LiveData<Boolean> = _loading
init {
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 = true
try {
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>()
}
- 常用功能集成对比
导航处理
FlutterActivity:
kotlin
// 简单的 Intent 导航
startActivity(FlutterActivity.withNewEngine().build(this))
FlutterFragmentActivity:
kotlin
// 复杂的 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 (受限):
xml
<style name="FlutterTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
FlutterFragmentActivity (完整):
xml
<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 (手动管理):
kotlin
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):
kotlin
// 自动状态持久化
class StateViewModel : ViewModel() {
private val _state = mutableStateFlow<AppState>(AppState.Idle)
val state: StateFlow<AppState> = _state
fun updateState(newState: AppState) {
_state.value = newState
}
}
- 性能与内存考量
方面 FlutterActivity FlutterFragmentActivity
启动性能 ⚡️ 更快 (~100ms) ⏳ 稍慢 (~150ms)
内存占用 📉 较低 (~30MB) 📈 较高 (~45MB)
渲染性能 🎯 优化更好 🔧 需要调优
生命周期 🟢 简单 🟡 复杂但完整
- 实际项目架构建议
方案一:纯 Flutter 应用
kotlin
// 使用 FlutterActivity 作为主要入口
class MainActivity : FlutterActivity() {
// 简单配置,快速启动
}
// 配置 AndroidManifest.xml
<activity android:name=".MainActivity">
<meta-data android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/FlutterTheme"/>
</activity>
方案二:混合开发应用
kotlin
// 使用 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() {
// 管理多个 Fragment
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host) as NavHostFragment
navController = navHostFragment.navController
}
private fun setupViewModels() {
// 观察多个 ViewModel
viewModel.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()
}
}
}
}
}
- 迁移指南
从 FlutterActivity 迁移到 FlutterFragmentActivity
- 修改继承关系
kotlin
// 之前
class MyActivity : FlutterActivity()
// 之后
class MyActivity : FlutterFragmentActivity()
- 添加布局文件
xml
<!-- res/layout/activity_main.xml -->
<LinearLayout>
<androidx.appcompat.widget.Toolbar/>
<FrameLayout android:id="@+id/flutter_container"/>
</LinearLayout>
- 初始化 Fragment
kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction()
.replace(R.id.flutter_container, FlutterFragment.createDefault())
.commit()
}
- 集成 ViewModel
kotlin
private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 观察 LiveData
viewModel.data.observe(this) { updateUI(it) }
}
- 最佳实践总结
选择 FlutterActivity 当:
· ✅ 开发纯 Flutter 应用
· ✅ 需要最快的启动速度
· ✅ 项目结构简单
· ✅ 不需要原生 UI 组件
选择 FlutterFragmentActivity 当:
· ✅ 需要混合开发
· ✅ 使用 ViewModel 和 LiveData
· ✅ 需要 Fragment 管理
· ✅ 集成原生 Android 功能
· ✅ 需要完整的主题支持
推荐架构:
FlutterFragmentActivity
├── ViewModel (业务逻辑)
├── LiveData (状态管理)
├── Fragment (UI 管理)
├── DataBinding (可选)
└── Navigation Component (导航)
结论
FlutterActivity 适合简单的纯 Flutter 应用,而 FlutterFragmentActivity 为混合开发提供了完整的 Android 架构组件支持。在选择时,应考虑项目的复杂度、团队的技术栈和长期维护需求。对于大多数企业级应用,推荐使用 FlutterFragmentActivity 以获得更好的可扩展性和维护性。