MitraIde

News

Cari Di Situs Ini

Minggu, 24 Maret 2024

Flutter MVVM

Hai, kali ini saya sedang belajar Flutter tentang konsep MVVM. 
agar lebih mudah dipahami kita akan coba praktek langsung


Part1 : (data beruba variabel local)

Untuk format folder adalah seperti berikut :




main.dart :

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'View/CounterPage.dart';
import 'ViewModel/CounterViewModel.dart';
import 'Model/CounterModel.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterViewModel(CounterModel()),
child: MaterialApp(
home: CounterPage(),
initialRoute: '/',
),
),
);
}


CounterModel.dart (Model) :

class CounterModel {
int _count = 0;
int get count => _count;

String _nama = "";
String get nama => _nama;

void increment() {
_count++;
}
void kurangi() {
_count = _count - 10 ;
}

void dapatkanNama(){
_nama = _nama + _count.toString();
}


}


CounterViewModel.dart (ViewModel) :

// Dalam direktori viewmodel/counter_viewmodel.dart
import 'package:flutter/material.dart';
import '../Model/CounterModel.dart';


class CounterViewModel extends ChangeNotifier {
final CounterModel _model;

CounterViewModel(this._model);

int get count => _model.count;
String get nama => _model.nama;

void increment() {
_model.increment();
notifyListeners();
}

void kurangi() {
_model.kurangi();
notifyListeners();
}

void dapatkanNama(){
_model.dapatkanNama();
notifyListeners();
}

}



CounterPage.dart (View)

// Dalam direktori view/counter_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../ViewModel/CounterViewModel.dart';

class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('MVVM Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<CounterViewModel>(
builder: (context, model, _) {
return Text(
'Counter: ${model.count}',
style: TextStyle(fontSize: 24),
);
},
),
SizedBox(height: 20),
Consumer<CounterViewModel>(
builder: (context, model, _) {
return Text(
'Nama: ${model.nama}',
style: TextStyle(fontSize: 24),
);
},
),

SizedBox(height: 20),
ElevatedButton(
onPressed: () {
Provider.of<CounterViewModel>(context, listen: false)
.increment();
},
child: Text('Increment'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
Provider.of<CounterViewModel>(context, listen: false)
.kurangi();
},
child: Text('Kurangi'),
),

SizedBox(height: 20),
ElevatedButton(
onPressed: () {
Provider.of<CounterViewModel>(context, listen: false)
.dapatkanNama();
},
child: Text('Datapkan nama'),
),

],
),
),
);
}
}


Untuk hasilnya adalah seperti berikut :