FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践
在 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 集成
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)}
}
- 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>()
}
- 常用功能集成对比
导航处理
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}
}
- 性能与内存考量
方面 FlutterActivity FlutterFragmentActivity
启动性能 ⚡️ 更快 (~100ms) ⏳ 稍慢 (~150ms)
内存占用 📉 较低 (~30MB) 📈 较高 (~45MB)
渲染性能 🎯 优化更好 🔧 需要调优
生命周期 🟢 简单 🟡 复杂但完整
- 实际项目架构建议
方案一:纯 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()}}}}
}
- 迁移指南
从 FlutterActivity 迁移到 FlutterFragmentActivity
- 修改继承关系
// 之前
class MyActivity : FlutterActivity()// 之后
class MyActivity : FlutterFragmentActivity()
- 添加布局文件
<!-- res/layout/activity_main.xml -->
<LinearLayout><androidx.appcompat.widget.Toolbar/><FrameLayout android:id="@+id/flutter_container"/>
</LinearLayout>
- 初始化 Fragment
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)supportFragmentManager.beginTransaction().replace(R.id.flutter_container, FlutterFragment.createDefault()).commit()
}
- 集成 ViewModel
private val viewModel: MyViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 观察 LiveDataviewModel.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 以获得更好的可扩展性和维护性。