Flutter与原生状态管理

当然,以下是通过代码示例对比 Android、iOS 原生开发和 Flutter 中的状态管理。

1. Android 状态管理

使用 ViewModel 和 LiveData

ViewModel 和 LiveData 是 Android Jetpack 提供的,用于在配置更改(如屏幕旋转)时保留 UI 相关的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// CounterViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {
private val _counter = MutableLiveData<Int>().apply { value = 0 }
val counter: LiveData<Int> get() = _counter

fun increment() {
_counter.value = (_counter.value ?: 0) + 1
}

fun decrement() {
_counter.value = (_counter.value ?: 0) - 1
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// MainActivity.kt
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
private val counterViewModel: CounterViewModel by viewModels()

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

counterViewModel.counter.observe(this, Observer {
counter_text.text = it.toString()
})

increment_button.setOnClickListener {
counterViewModel.increment()
}

decrement_button.setOnClickListener {
counterViewModel.decrement()
}
}
}

2. iOS 状态管理

使用 Swift 和 PropertyObserver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// CounterViewModel.swift
import Foundation

class CounterViewModel: ObservableObject {
@Published var counter: Int = 0

func increment() {
counter += 1
}

func decrement() {
counter -= 1
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// ContentView.swift
import SwiftUI

struct ContentView: View {
@ObservedObject var viewModel = CounterViewModel()

var body: some View {
VStack {
Text("Count: \(viewModel.counter)")
.font(.largeTitle)

HStack {
Button(action: {
viewModel.increment()
}) {
Image(systemName: "plus")
}

Button(action: {
viewModel.decrement()
}) {
Image(systemName: "minus")
}
}
.font(.largeTitle)
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

3. Flutter 状态管理

使用 GetX

1
2
3
4
5
6
7
8
9
// counter_controller.dart
import 'package:get/get.dart';

class CounterController extends GetxController {
var counter = 0.obs;

void increment() => counter.value++;
void decrement() => counter.value--;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'counter_controller.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
home: CounterPage(),
);
}
}

class CounterPage extends StatelessWidget {
final CounterController counterController = Get.put(CounterController());

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter'),
),
body: Center(
child: Obx(() {
return Text('Count: ${counterController.counter.value}', style: TextStyle(fontSize: 24));
}),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: counterController.increment,
child: Icon(Icons.add),
),
SizedBox(height: 8),
FloatingActionButton(
onPressed: counterController.decrement,
child: Icon(Icons.remove),
),
],
),
);
}
}

比较

  1. Android (ViewModel + LiveData):

    • 使用 ViewModel 来存储和管理界面相关的数据。
    • 使用 LiveData 来观察数据的变化并更新 UI。
    • 通过 ActivityFragment 的生命周期管理组件。
  2. iOS (SwiftUI + ObservableObject):

    • 使用 ObservableObject 来存储和管理数据。
    • 使用 @Published 来标记可观察的数据。
    • 使用 @ObservedObject 来在 SwiftUI 视图中观察数据变化并更新 UI。
  3. Flutter (GetX):

    • 使用 GetxController 来管理状态。
    • 使用 Obx 小部件来响应状态变化并更新 UI。
    • Get.put 用于依赖注入,简化了控制器的管理。

在这三种方法中,所有方法都提供了响应式的状态管理机制,确保当状态改变时,UI 会自动更新。不同平台有不同的实现方式,但目标都是相同的:高效地管理应用状态,提供更好的用户体验。