Flutter架构设计MVC

尽管官方推荐使用 Model-View-Model (MVVM) 或provide设计等,因为它们提供了更好的状态管理和响应式更新。这些模式更适合 Flutter 的设计哲学和框架特性。 但是经典MVC,在Flutter中,如何实现呢?

1.Flutter MVC架构设计的基本示例:

  • Model: 数据模型,记录用户数据或状态。
  • View: 用户界面,View负责显示Model的状态,通常会包含逻辑来响应用户的输入。
  • Controller:控件器,作为Model与View交互的中介,处理用户输入,并更新模型,并显示在视图中。

2.Model

1
2
3
4
5
6
class PersonInfo {
   String name = '';
   int age = 0;

  PersonInfo(this.name, this.age);
}

3.Controller

 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

import 'package:base_demo/pages/mine/person/person_info.dart';

class PersonInfoController {
  late PersonInfo _model;

  PersonInfo get model => _model;

  PersonInfoController() {
    _model = PersonInfo('', 0);
  }

  void updateName(String name) {
    _model.name = name;
  }

  void decrement() {
    _model.age -= 1;
  }

  void increment() {
    _model.age += 1;
  }

  String personInfo () {
    return 'name: ${_model.name}, age: ${_model.age}';
  }

}

4.View

 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
50
51
52
53
54
55
56
import 'package:base_demo/pages/mine/person/person_info_controller.dart';
import 'package:base_demo/pages/mine/person/person_info.dart';
import 'package:flutter/material.dart';

class PersonInfoView extends StatefulWidget {
  final PersonInfoController controller;

  const PersonInfoView({super.key, required this.controller});

  @override
  State<StatefulWidget> createState() => _PersonInfoViewState();
}

class _PersonInfoViewState extends State<PersonInfoView> {
  late PersonInfoController _controller;

  @override
  void initState() {
    _controller = widget.controller;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('MVC'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Text('personInfo = ${_controller.personInfo()}'),
              ElevatedButton(
                onPressed: () => setState(() {
                  _controller.updateName('ksnowlv');
                }),
                child: const Text('name ksnowlv'),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _controller.increment();
                }),
                child: const Text('age Increment'),
              ),
              ElevatedButton(
                onPressed: () => setState(() {
                  _controller.decrement();
                }),
                child: const Text('age decrement'),
              ),
            ],
          ),
        ));
  }
}

5.效果

image

6.小结

1.示例设计

  • PersonInfo:作为模型,比较简单,提供的姓名,年龄,仅仅作演示。
  • PersonInfoController:负责处理用户输入,并更新PersonInfo模型数据。
  • PersonInfoView:作为视图,因需要能够响应用户的输入,并更新显示,所以是一个StatefulWidget;直接与UserController交互,以便数据变化时,更新视图状态;当视图有输入时,通过更新模型,进而更新视图显示。如果仅仅是展示数据,视图可以是StatelessWidget。

2.推荐设计

Flutter社区更倾向于使用MVVMProvider模式,因为它们提供了更好的状态管理和响应式更新。