MVC패턴이나 MVVM 패턴은 인터페이스, 데이터, 데이터 제어에 사용되는 소프트웨어 디자인 패턴이다. Model, View Model, View는 각자의 역할을 하며, 팀 단위 프로젝트에 큰 도움이 된다.
만일, 한 페이지 안에 변수, 함수, 위젯을 한번에 선언하게 되면, dart파일의 처음부터 끝까지 읽으며 수정해야 되기 때문에, 많은 시간이 소요될 것이다.
하지만, 각 Model, ViewModel, View로 분리한다면 필요한 부분만 가서 변경할 수 있다. 이러면 코드를 전부 읽지 않아도 특정 위치에 변경 지점이 있다는 것을 인지할 수도 있고, 접근 시간이 단축될 것이다.
API 통신은 Restful Api를 사용하며 디렉터리를 따로 구성한다. 그 이유는 개인적으로 API 함수(Post, Get, Delete 등)을 한곳에 모아두면 수정이 수월하기 때문이다.
API를 통해 얻은 데이터는 with ChangeNotifier를 포함한 클래스에 저장하여 사용한다.

dependencies:
  flutter:
    sdk: flutter
  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  mvc_pattern: 8.12.0
  get: 4.6.5class Number{
  int _num = 0;
  
  get num => _num;
  
  int increment() => ++_num;
  int decrement() => --_num;
}setState 사용으로 화면을 다시 그려준다.import 'package:mvc_pattern/mvc_pattern.dart';
import 'package:statement/mvc/model/number.dart';
class NumberController extends ControllerMVC {
  // 생성자 기본으로 작성해야 될 부분
  factory NumberController([StateMVC? state]) =>
      _this ??= NumberController._(state);
  // controller 생성자에 모델 생성자 초기화.
  NumberController._(StateMVC? state)
      : _number = Number(),
        super(state);
  final Number _number;
  static NumberController? _this;
  get num => _number.num;
  /// 화면 업데이트
  void update() => setState(() {});
  /// num 증가
  void incrementNum() {
    _number.increment();
    update();
  }
  
  /// num 감소
  void decrementNum(){
    _number.decrement();
    update();
  }
}import 'package:flutter/material.dart';
import 'package:mvc_pattern/mvc_pattern.dart';
import 'package:statement/mvc/controller/number_controller.dart';
class NumberView extends StatefulWidget {
  const NumberView({Key? key}) : super(key: key);
  
  State createState() => _NumberViewState();
}
class _NumberViewState extends StateMVC<NumberView> {
  _NumberViewState() : super(NumberController()) {
    numberController = controller as NumberController;
  }
  late NumberController numberController;
  
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(numberController.num.toString()),
              ElevatedButton(
                  onPressed: () {
                    numberController.incrementNum();
                  },
                  child: const Text('증가')),
              ElevatedButton(
                  onPressed: () {
                    numberController.decrementNum();
                  },
                  child: const Text('감소')),
            ],
          ),
        ),
      ),
    );
  }
}void main() {
  runApp(const GetMaterialApp(
    title: 'Flutter Demo',
    home: NumberView(),
 ));
}증가 버튼을 클릭하면 0에서 클릭 수 만큼 값이 증가하고, 감소 버튼 클릭 시, 클릭 수 만큼 값이 감소한다.

참고 문서 :
 https://pub.dev/packages/mvc_pattern
https://www.incodom.kr/flutter_mvc
https://minwook-shin.github.io/flutter-mvc/
https://www.youtube.com/watch?v=5xLXC1nnjlM&t=409s