Saat kita membuat aplikasi android Ada beberapa pilihan untuk menyimpan data secara lokal di smartphone, seperti database sqlite atau Shared Preferences.
Shared Preferences adalah cara penyimpanan data pada smarthphone dengan format key value pair. Mirip dengan JSON object atau Map. Shared preferences bisa menyipan data berupa sring, integer, double atau boolean. Jika data yang diolah tidak banyak dan bukan data penting / rahasia Shared Preferences adalah pilihan yang tepat, karena proses baca dan tulisnya sangat mudah.
Pada tutorial ini saya akan membahas bagaimana membuat operasi CRUD (Create Read Update dan Delete) menggunakan Shared Preferences. Programnya sederhana saja yaitu mengumpulkan data customer berupa nama, alamat dan no telepon. Kemudian menampilkannya di List View. Serta operasi untuk edit dan delete data tersebut.
Update depedency di file pubspec.yaml
Untuk menyimpan dan membaca Shared Preferences butuh library shared_preferences. Buka file pubspec.yaml dan tambahkan kode berikut shared_preferences: dibawah blok dependencies:. Ingat di file pubspec.yaml indentasi sangat penting. Aplikasi kita bisa error jika jumlah spasi atau tab antar baris tidak sama. Kira-kira hasilnya bakal seperti ini
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
shared_preferences: # tambahkan ini
Class Helper
Untuk memudahkan proses membaca dan menulis Shared Preferences buat static class agar bisa dengan mudah dipanggil dari class lain. Pada folder lib klik kanan dan pilih New >> Dart File. Isi data.dart sebagai nama file. Masukkan kode dibawah ini.
import 'package:shared_preferences/shared_preferences.dart'; // import module untuk baca dan tulis Shared Preferences
import 'dart:convert'; // import module untuk mengubah data Shared Preferences yang berupa string menjadi list atau map dart
class Data {
// baca data dari smartphone
static getData() async {
var prefs = await SharedPreferences.getInstance();
// shared preferences menggunakan format key value pair
// untuk membaca data kita perlu memasukkan key pada method getString
// pastikan key adalah unik, jadi lebih baik gunakan nama domain
var savedData = prefs.getString('ID.NGASTURI.TUTORIAL.PREF');
// jika nilai masih null, misal saat pertama kali install
// kita beri nilai default agar tidak error saat diconvert dengan perintah json.decode
if(savedData == null){
savedData = '[]';
}
// data yang disimpan di shared preferences sebaiknya string dengan fomat json
// agar bisa dengan mudah diolah menjadi list atau map dart
return json.decode(savedData);
}
static saveData(data) async {
var prefs = await SharedPreferences.getInstance();
// untuk menulis data kita memasukkkan key dan value
// value dalam hal ini adalah variabel data yang masih dalam bentuk list atau map
// jadi perlu diubah jadi string dengan format json
prefs.setString('ID.NGASTURI.TUTORIAL.PREF', json.encode(data));
}
}
Halaman Home
Di halaman Home ini kita menampilkan daftar customer dalam bentuk list. Jika list tersebut di klik akan diarahkan ke halaman Insert, sehingga user bisa edit atau hapus data tersebut. Edit file main.dart dengan kode dibawah ini.
import 'package:flutter/material.dart';
import 'insert.dart';
import 'data.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// data customer yang akan ditampilkan di list view
// beri nilai awal berupa list kosong agar tidak error
// nantinya akan diisi data dari Shared Preferences
var savedData = [];
// method untuk mengambil data Shared Preferences
getSavedData() async {
var data = await Data.getData();
// setelah data didapat panggil setState agar data segera dirender
setState(() {
savedData = data;
});
}
// init state ini dipanggil pertama kali oleh flutter
@override
initState() {
super.initState();
// baca Shared Preferences
getSavedData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
backgroundColor: Colors.blue,
actions: <Widget>[
FlatButton(
onPressed: (){
// action tombol ADD untuk proses insert
// nilai yang dikirim diisi null
// agar di halaman insert tahu jika null berarti operasi insert data
// jika tidak null maka update data
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Insert(index: null, value: null))
).then((value){
// jika halaman insert ditutup ambil kembali Shared Preferences
// untuk mendapatkan data terbaru dan segera ditampilkan ke user
// misal jika ada data customer yang ditambahkan
getSavedData();
});
},
child: Text(
'ADD',
style: TextStyle(
color: Colors.white
),
),
)
],
),
body: Padding(
padding: EdgeInsets.fromLTRB(20, 20, 20, 20),
child: ListView.builder(
itemCount: savedData.length,
itemBuilder: (context, index){
return ListTile(
title: Text(savedData[index]['name']),
subtitle: Text(savedData[index]['address'] + ' ' + savedData[index]['phone']),
contentPadding: EdgeInsets.fromLTRB(0, 0, 0, 0),
onTap: (){
// aksi saat user klik pada item customer pada list view
// nilai diisi selain null menandakan di halaman insert operasi yang berjalan adalah update atau delete
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Insert(index: index, value: savedData[index]))
).then((value){
// jika halaman insert ditutup ambil kembali Shared Preferences
// untuk mendapatkan data terbaru dan segera ditampilkan ke user
// misal jika ada data customer yang diedit atau dihapus
getSavedData();
});
},
);
}
),
)
);
}
}
Halaman Insert
Halaman ini terdapat beberapa field untuk mengisi data. Juga terdapat tombol delete. Buat file insert.dart dan tambahkan kode dibawah ini
import 'package:flutter/material.dart';
import 'data.dart';
class Insert extends StatefulWidget {
final index;
final value;
Insert({Key key, @required this.index, @required this.value}) : super(key: key);
@override
_InsertState createState() => _InsertState(index: index, value: value);
}
class _InsertState extends State<Insert> {
_InsertState({@required this.index, @required this.value}) : super();
// variabel untuk menampung data yang dikirim dari halaman home
final index;
final value;
// controller TextField untuk validasi
final nameController = TextEditingController();
final addressController = TextEditingController();
final phoneController = TextEditingController();
// cek semua data sudah diisi atau belum
isDataValid() {
if(nameController.text.isEmpty){
return false;
}
if(addressController.text.isEmpty){
return false;
}
if(phoneController.text.isEmpty){
return false;
}
return true;
}
getData(){
// jika nilai index dan value yang dikirim dari halaman home tidak null
// artinya ini adalah operasi update
// tampilkan data yang dikirim, sehingga user bisa edit
if(index != null && value != null){
setState(() {
nameController.text = value['name'];
addressController.text = value['address'];
phoneController.text = value['phone'];
});
}
}
// proses menyimpan data yang diinput user ke Shared Preferences
saveData() async {
// cek semua data sudah diisi atau belum
// jika belum tampilkan pesan error
if(isDataValid()){
// data yang akan dimasukkan atau diupdate ke Shared Preferences sesuai input user
var customer = {
'name': nameController.text,
'address': addressController.text,
'phone': phoneController.text
};
// ambil data Shared Preferences sebagai list
var savedData = await Data.getData();
if(index == null){
// index == null artinya proses insert
// masukkan data pada index 0 pada data Shared Preferences
// sehingga pada halaman Home data yang baru dimasukkan
// akan tampil paling atas
savedData.insert(0, customer);
}else{
// jika index tidak null artinya proses update
// update data Shared Preferences sesuai index-nya
savedData[index] = customer;
}
// simpan data yang diinsert / diedit user ke Shared Preferences kembali
// kemudian tutup halaman insert ini
await Data.saveData(savedData);
Navigator.pop(context);
}else{
showDialog(
context: context,
builder: (context){
return AlertDialog(
title: Text('Empty Field'),
content: Text('Please fill all field.'),
actions: <Widget>[
FlatButton(
onPressed: (){
Navigator.pop(context);
},
child: Text('OK'),
)
],
);
}
);
}
}
deleteData() async {
// ambil data Shared Preferences sebagai list
// delete data pada index yang sesuai
// kemudian simpan kembali ke Shared Preferences
// dan kembali ke halaman Home
var savedData = await Data.getData();
savedData.removeAt(index);
await Data.saveData(savedData);
Navigator.pop(context);
}
getDeleteButton(){
// jika proses update tampilkan tombol delete
// jika insert return widget kosong
if(index != null && value != null){
return FlatButton(
child: Text(
'DELETE',
style: TextStyle(
color: Colors.white
),
),
onPressed: (){
deleteData();
},
);
}else{
return SizedBox.shrink();
}
}
@override
initState() {
super.initState();
getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Insert'),
backgroundColor: Colors.blue,
actions: <Widget>[
getDeleteButton(),
FlatButton(
onPressed: (){
saveData();
},
child: Text(
'SAVE',
style: TextStyle(
color: Colors.white
),
),
),
],
),
body: Padding(
padding: EdgeInsets.fromLTRB(20, 20, 20, 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Name'),
TextField(
controller: nameController,
),
Padding(
padding: EdgeInsets.only(top: 20),
),
Text('Address'),
TextField(
controller: addressController,
),
Padding(
padding: EdgeInsets.only(top: 20),
),
Text('Phone'),
TextField(
controller: phoneController,
)
],
),
)
);
}
}
Berikut ini tampilan akhirnya.
2 Replies to “Flutter Operasi CRUD tanpa Database dengan Shared Preferences”
Maaf, mas mau tanya, itu di halaman insert.dart ada kaya =>, itu maksudnya gimana?
Di saya error mas, mohon penjelesannya , saya buat belajar
Sorry, itu sebenarnya adalah operator lebih besar atau sama dengan (=>) tanda lebih besar di ubah jadi & gt; sama wordpress. sekarang sudah diperbaiki.