MVC패턴에서 한 번 더 파생되어 의존성 부분을 최소화시켜 나오게 되었다.
MVVM패턴이란, Model, View, ViewModel의 줄임말로 하나의 소프트웨어를 최대한 작은 단위로 나누어 마치 Modul화를 형성하듯 테스트가 쉽고 관리하기도 쉬운 구조를 목표로 한 디자인 패턴이다.
MVC패턴에서의 Model과 View간의 의존성 문제를 극복했을 뿐만 아니라, Controller와 View간의 의존성도 최소화할 수 있다는 장점이 있다.
장점 : MVVM 모델의 가장 큰 장점은 View로부터 독립적이기 때문에 별도로 ViewModel만을 떼어내 테스트 할 수 있고, 하나의 ViewModel만으로 여러 개의 View에 활용할 수 있다는 장점이 있다.
기존의 MVC 패턴처럼 View를 위한 Controller를 매번 만들 필요가 없으며 그만큼 View가 View만의 역할을 충실하게 임할 수 있도록 도와준다는 장점이 있다.
provider
라이브러리 추가하기.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
provider: 6.0.5
import 'package:flutter/material.dart';
class NumberViewModel with ChangeNotifier{
int _num = 0;
int get num => _num;
void incrementNum(){
_num++;
notifyListeners();
}
void decrementNum(){
_num--;
notifyListeners();
}
}
Provider.of
를 사용하여 접근한다.import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:statement/mvvm/ui/number/number_view_model.dart';
class NumberView extends StatelessWidget {
NumberView({Key? key}) : super(key: key);
late NumberViewModel _numberViewModel;
Widget build(BuildContext context) {
_numberViewModel = Provider.of<NumberViewModel>(context, listen: false);
return Scaffold(
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<NumberViewModel>(
builder: (_, NumberViewModel viewModel, __) {
return Text(viewModel.num.toString());
}),
ElevatedButton(
onPressed: () {
_numberViewModel.incrementNum();
},
child: const Text('증가')),
ElevatedButton(
onPressed: () {
_numberViewModel.decrementNum();
},
child: const Text('감소')),
],
),
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:statement/mvc/view/number_view.dart';
import 'package:statement/mvvm/ui/number/number_view_model.dart';
class NumberPage extends StatelessWidget {
const NumberPage({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<NumberViewModel>(
create: (_) => NumberViewModel()),
],
child: const NumberView(),
);
}
}
runApp(
const MaterialApp(
title: 'Flutter Demo',
home: NumberPage(),
),
);
증가 버튼을 클릭하면 위, 반응형으로 표기해둔 숫자(num)이 증가 할 것이고, 감소 버튼을 클릭하면 숫자(num)이 감소 할 것이다.
참고 문서 :
https://m.blog.naver.com/lmj_java/222084721535
https://veiz.me/42
https://www.youtube.com/watch?v=wh6jfZJelf0