Membuat CRUD dengan Local Storage di Flutter

Share:
Membuat CRUD dengan Local Storage di Flutter

Halo semuanya, kembali lagi di sahretech. Pada kesempatan kali ini kita akan belajar membuat aplikasi sederhana yang dapat menjalankan fungsi CRUD dengan local storage di flutter. Ayo ikuti tutorial selengkapnya di bawah ini.



Local Storage

Local storage merujuk pada mekanisme penyimpanan data di perangkat secara lokal. Dengan menggunakan local storage, Anda dapat menyimpan data seperti pengaturan pengguna, preferensi, atau bahkan cache data secara persisten di perangkat pengguna. 

Dengan menggunakan local storage anda tidak perlu mengakses internet untuk mengambil data dari database. Pada kesempatan kali ini, kita akan membuat aplikasi kontak sederhana yang memanfaatkan local storage. Di tutorial ini anda akan mempelajari CRUD, dan penyimpanan lokal dengan flutter

Baca Artikel Lain ✨
📰 1. Cara Paling Mudah Membuat Login Google di Flutter read more
📰 2. CRUD Flutter + PHP + MySQL Part 2, Membuat Mobile App read more
📰 3. Membuat Aplikasi CRUD dengan Flutter dan SQFlite read more



Cara Membuat Aplikasi Kontak di Flutter

1. Buatlah sebuah project flutter baru dengan nama flutter_contact. Atau dengan nama yang anda inginkan.

2. Buka pubspec.yaml lalu tambahkan shared_preferences: ^2.0.17 kemudian save file untuk mendownload package contonya bisa kalian lihat seperti gambar di bawah ini.

CRUD Local Storage Flutter
Menambahkan Package




3. Buka lib/main.dart. Lalu isi dengan script di bawah ini.



  import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_contact/add_data_page.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'edit_data_page.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: DataContact(), ); } } class DataContact extends StatefulWidget { @override State<DataContact> createState() => _DataContactState(); } class _DataContactState extends State<DataContact> { //variabel data untuk menampung data dari local storage List<Map<String, String>> data = []; @override void initState() { super.initState(); //saat state berubah jalankan fungsi getData getData(); } // fungsi untuk mengambil data dari SharedPreferences Future<void> getData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); //digunakan untuk mendapatkan nilai dari SharedPreferences dengan kunci 'data' List<String> dataList = prefs.getStringList('data') ?? []; //variabel untuk menampung data yang sudah diparse List<Map<String, String>> parsedData = []; //melakukan perulangan dari dataList for (String dataItem in dataList) { //jsonDecode berfungsi untuk mengkonversi data json menjadi dart objek //data yang sudah dikonversi akan disimpan ke dalam variabel decoodedData Map<String, dynamic> decodedData = jsonDecode(dataItem); Map<String, String> parsedItem = {}; //melakukan perulangan pada decodedData decodedData.forEach((key, value) { parsedItem[key] = value.toString(); }); //data yang sudah diparse ditambahkan ke parsedData parsedData.add(parsedItem); } //perubahan state, perbarui data setState(() { data = parsedData; }); } //metode untuk menghapus data Future<void> deleteData(int index) async { //adalah metode yang digunakan untuk mendapatkan instance (instansiasi) objek SharedPreferences dalam Flutter. SharedPreferences prefs = await SharedPreferences.getInstance(); //digunakan untuk mendapatkan nilai dari SharedPreferences dengan kunci 'data' List<String> dataList = prefs.getStringList('data') ?? []; //menghilangkan data dari dataList berdasarkan index dataList.removeAt(index); //set ulang local storage dengan data yang diperbarui prefs.setStringList('data', dataList); //jalankan fungsi getData getData(); } //membuka halaman EditPage void openEditPage(Map<String, String> data) { Navigator.push( context, //fungsi untuk berpindah halaman MaterialPageRoute( //data adalah parameter yang dikirimkan dan akan ditampilkan di halaman openeditpage builder: (context) => EditDataPage(data: data), ), //fungsi yang akan dijalankan setelah proses update dijalankan ).then((_) { getData(); }); } //fungsi untuk membuka halaman addpage void openAddPage() { Navigator.push( context, //fungsi untuk berpindah halaman MaterialPageRoute( builder: (context) => AddDataPage(), ), //fungsi yang akan dijalankan setelah proses update dijalankan ).then((_) { getData(); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Contact App'), ), //jika data kosong maka tampilkan tulisan belum ada data di tengah layar //jika data ada maka tampilkan datanya dengan listview builder body: data.isEmpty ? Center( child: Text('Belum ada data'), ) : ListView.builder( // Menampilkan daftar kontak dalam bentuk ListView itemCount: data.length, //total panjang data itemBuilder: (context, index) { return Padding( padding: const EdgeInsets.only(top: 16), child: ListTile( title: Text('Name: ${data[index]['name']}'), //menampilkan nama subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Email: ${data[index]['email']}'), //menampilkan email Text('Phone: ${data[index]['phoneNumber']}'), //menampilkan nomor telpon Text('Address: ${data[index]['address']}'), //menampilkan alamat ], ), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ // Tombol edit untuk mengedit data // saat ditekan akan menjalankan fungsi openEditPage dan membawa parameter IconButton( icon: Icon(Icons.edit), //icon edit onPressed: () => openEditPage(data[index]), ), // Tombol hapus untuk menghapus data // saat ditekan akan menjalankan fungsi deleteData dan membawa parameter IconButton( icon: Icon(Icons.delete), //icon delete onPressed: () => deleteData(index), ), ], ), ), ); }, ), floatingActionButton: FloatingActionButton( onPressed: () => openAddPage(), child: Icon(Icons.add), // Ikona FAB backgroundColor: Colors.blue, // Warna latar belakang FAB ), ); } }


4. Buat file baru di dalam folder lib/add_data_page.dart kemudian isi dengan script di bawah ini.



import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_contact/main.dart'; import 'package:shared_preferences/shared_preferences.dart'; class AddDataPage extends StatefulWidget { @override _AddDataPageState createState() => _AddDataPageState(); } class _AddDataPageState extends State<AddDataPage> { //variabel yang akan kita gunakan untuk mengecek keadaan form //digunakan sebagai variabel validasi final formKey = GlobalKey<FormState>(); //inisiasi field teks final TextEditingController nameController = TextEditingController(); final TextEditingController emailController = TextEditingController(); final TextEditingController addressController = TextEditingController(); final TextEditingController phoneNumberController = TextEditingController(); //fungsi untuk menyimpan form void saveForm() { //jika statenya sah atau valid maka jalankan penyimpanan data if (formKey.currentState!.validate()) { String name = nameController.text; String email = emailController.text; String address = addressController.text; String phoneNumber = phoneNumberController.text; //metode untuk menyimpan data saveData(name, email, address, phoneNumber); } } //metode untuk menyimpan data Future<void> saveData(String name, String email, String address, String phoneNumber) async { SharedPreferences prefs = await SharedPreferences.getInstance(); //mengambil data dari localstorage dengan kunci key List<String> dataList = prefs.getStringList('data') ?? []; //membuat variabel objek dengan data yang diisi melalui form Map<String, String> newData = { 'name': name, 'email': email, 'address': address, 'phoneNumber': phoneNumber }; dataList.add(jsonEncode(newData)); // Menambahkan data baru ke dalam daftar prefs.setStringList('data', dataList); // Menyimpan daftar data ke local storage Navigator.pop(context); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Add Contact Profile'), ), //singlechildscrollview adalah widget yang digunakan agar component di dalamnya dapat discroll body: SingleChildScrollView( child: Padding( padding: EdgeInsets.all(16), child: Form( key: formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( controller: nameController, decoration: InputDecoration(labelText: 'Name'), validator: (value) { if (value!.isEmpty) { return 'Please enter your name'; } return null; }, ), TextFormField( controller: emailController, decoration: InputDecoration(labelText: 'Email'), validator: (value) { if (value!.isEmpty) { return 'Please enter your email'; } return null; }, ), TextFormField( controller: phoneNumberController, decoration: InputDecoration(labelText: 'Phone Number'), validator: (value) { if (value!.isEmpty) { return 'Please enter your Phone Number'; } return null; }, ), TextFormField( controller: addressController, maxLines: 5, decoration: InputDecoration(labelText: 'Address'), validator: (value) { if (value!.isEmpty) { return 'Please enter your address'; } return null; }, ), SizedBox(height: 16,), ElevatedButton( //saat tombol diklik jalankan fungsi saveForm onPressed: saveForm, child: Text('Save'), ), ], ), ), ), ), ); } }


5. Buat file baru di dalam folder lib/edit_data_page.dart kemudian isi dengan script di bawah ini.



import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class EditDataPage extends StatefulWidget { final Map<String, String> data; // Variabel data sebagai parameter untuk EditDataPage EditDataPage({required this.data}); // Konstruktor EditDataPage dengan parameter data yang harus diberikan @override _EditDataPageState createState() => _EditDataPageState(); // Membuat state EditDataPage } class _EditDataPageState extends State<EditDataPage> { TextEditingController nameController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController phoneNumberController = TextEditingController(); TextEditingController addressController = TextEditingController(); // Membuat objek TextEditingController untuk mengendalikan input teks pada TextField @override void initState() { super.initState(); initializeControllers(); // Memanggil fungsi initializeControllers saat initState dipanggil } void initializeControllers() { nameController.text = widget.data['name'] ?? ''; emailController.text = widget.data['email'] ?? ''; phoneNumberController.text = widget.data['phoneNumber'] ?? ''; addressController.text = widget.data['address'] ?? ''; // Menetapkan nilai awal pada TextEditingController berdasarkan data yang diberikan } Future<void> saveData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); // Mendapatkan instance SharedPreferences List<String> dataList = prefs.getStringList('data') ?? []; // Mendapatkan daftar data dari SharedPreferences, jika tidak ada maka menggunakan list kosong Map<String, String> newData = { 'name': nameController.text, 'email': emailController.text, 'phoneNumber': phoneNumberController.text, 'address': addressController.text, }; // Membuat map newData berisi data yang diperbarui dari TextEditingController int dataIndex = dataList.indexOf(jsonEncode(widget.data)); // Mencari indeks data yang akan diperbarui dalam daftar menggunakan fungsi jsonEncode if (dataIndex != -1) { dataList[dataIndex] = jsonEncode(newData); // Jika data ditemukan, perbarui data tersebut dengan newData } prefs.setStringList('data', dataList); // Menyimpan daftar data yang diperbarui ke SharedPreferences Navigator.pop(context); // Kembali ke halaman sebelumnya setelah data disimpan } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Edit Contact Profile'), ), body: SingleChildScrollView( child: Padding( padding: EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( controller: nameController, decoration: InputDecoration(labelText: 'Name'), ), TextFormField( controller: emailController, decoration: InputDecoration(labelText: 'email'), ), TextFormField( controller: phoneNumberController, decoration: InputDecoration(labelText: 'phoneNumber'), ), TextFormField( controller: addressController, maxLines: 5, decoration: InputDecoration(labelText: 'Address'), ), ElevatedButton( onPressed: saveData, child: Text('Save'), ), ], ), ), ), ); } }


6. Semua step sudah kita keerjakan, saatnya melakukan uji coba. Untuk penjelasan saya sertakan di dalam script di atas. Jika masih kurang jelas, silahkan tanya langsung di kolom komentar di bawah ini. Silahkan jalankan project dengan emulator, jika berhasil maka tampilannya akan tampak seperti gambar di bawah ini.

membuat CRUD di Flutter
Halaman belum ada data, halaman tambah data, halaman sudah ada data


Sekian tutorial kita kali ini tentang cara membuat CRUD dengan local storage di flutter. Semoga tutorial singkat ini membantu. Sekian dan terima gaji.

No comments

Jangan lupa kasih komentar ya!. Karena komentar kalian membantu kami menyediakan informasi yang lebih baik

Tidak boleh menyertakan link atau promosi produk saat berkomentar. Komentar tidak akan ditampilkan. Hubungi 081271449921(WA) untuk dapat menyertakan link dan promosi