Beranda › Forums › Belajar Flutter Mobile Apps Tingkat Menengah › Saat simpan dan update note, note tercipta ganda(jadi dua)
Tagged: Praktek REST API III
- This topic has 6 replies, 2 voices, and was last updated 4 years, 4 months ago by Anonymous.
-
AuthorPosts
-
June 30, 2022 at 3:15 PM #51255
Dear Coach,
saat saya jalankan kode di emulator, dan coba tambahkan note baru, setelah di simpan note nya jadi ganda code jadi tercreate dua note dengan nama dan isi yang sama…begitu juga ketika saya update atau rubah note nya…tercipta lagi note baru dengan nama dan isi yang sama (kembar)…
Mohon solusinya coach..
June 30, 2022 at 3:17 PM #51257KODE add_or_detail_screen
import ‘dart:ffi’;
import ‘package:flutter/material.dart’;
import ‘package:intl/intl.dart’;
import ‘package:notes/models/note.dart’;
import ‘package:notes/providers/notes.dart’;
import ‘package:provider/provider.dart’;class AddOrDetailScreen extends StatefulWidget {
static const routeName = ‘/addOrDetailScreen’;
@override
State<AddOrDetailScreen> createState() => _AddOrDetailScreenState();
}class _AddOrDetailScreenState extends State<AddOrDetailScreen> {
Note _note = Note(
id: null,
title: ”,
note: ”,
updatedAt: null,
createdAt: null,
);bool init = true;
final _formKey = GlobalKey<FormState>();
void submitNote() {
_formKey.currentState.save();
final now = DateTime.now();
_note = _note.copyWith(updatedAt: now, createdAt: now);
final notesProvider = Provider.of<Notes>(context, listen: false);
if (_note.id == null) {
notesProvider.addNote(_note);
} else {
notesProvider.updateNote(_note);
}
notesProvider.addNote(_note);
Navigator.of(context).pop();
}@override
void didChangeDependencies() {
if (init) {
String id = ModalRoute.of(context).settings.arguments as String;
// tambahkan fungsi if untuk validasi penambahan note baru
//jika id tidak sama dengan null baru cari note dari provider,
//jika null berarti note baru dan tidak perlu cari data atau id dalam provider
if (id != null) {
_note = Provider.of<Notes>(context).getNote(id);
}
init = false;
}
super.didChangeDependencies();
}// fungsi untuk merubah format waktu di detail note
String _convertDate(DateTime dateTime) {
int diff = DateTime.now().difference(dateTime).inDays;
if (diff > 0) return DateFormat(‘dd-MM-yyyy’).format(dateTime);return DateFormat(‘hh-mm’).format(dateTime);
}@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
TextButton(
onPressed: submitNote,
child: Text(‘Simpan’),
)
],
),
body: Stack(
children: [
Container(
height: double.infinity,
padding: EdgeInsets.all(12),
// wrap dengan SingleChildScrollView agar bisa di scroll
child: SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
// tambahkan initialValue agar saat note ditekan memunculkan judul
initialValue: _note.title,
decoration: InputDecoration(
hintText: ‘Judul’, border: InputBorder.none),
onSaved: (value) {
_note = _note.copyWith(title: value);
},
),
TextFormField(
// tambahkan initialValue agar saat note ditekan memunculkan isi note
initialValue: _note.note,
decoration: InputDecoration(
hintText: ‘Tulis Catatan Disini…’,
border: InputBorder.none),
onSaved: (value) {
_note = _note.copyWith(note: value);
},
// tambahkan maxLines untuk menampilkan note tulisan ke bawah
maxLines: null,
),
],
)),
),
),
// 1. Untuk menampilkan kapan note terakhir diubah
// 2. wrap dengan Positioned agar update waktu pindah ke bawah
// 3. tambahkan fungsi if karena ada penambahan note baru sedangkan note.updatedAt masih null
// 4. jika note.updated tidak null maka baru tampilkan kapan terakhir diubah note nya
if (_note.updatedAt != null)
Positioned(
bottom: 10,
right: 10,
child: Text(‘Terakhir diubah ${_convertDate(_note.updatedAt)}’),
),
],
),
);
}
}June 30, 2022 at 3:18 PM #51258CODE notes.dart
import ‘package:flutter/cupertino.dart’;
import ‘package:notes/api/note_api.dart’;
import ‘package:notes/models/note.dart’;class Notes with ChangeNotifier {
List<Note> _notes = [
Note(
id: ‘N1’,
title: ‘Catatan Materi Flutter’,
note:
‘Flutter merupakan Software Development Kit (SDK) yang bisa membantu developer dalam membuat aplikasi mobile cross platform. Kelas ini akan mempelajari pengembangan aplikasi mobile yang dapat dijalankan baik di IOS maupun di Android’,
updatedAt: DateTime.parse(‘2021-05-19 20:33:33’),
createdAt: DateTime.parse(‘2021-05-19 20:33:33’),
),
Note(
id: ‘N2’,
title: ‘Target Pembelajaran Flutter’,
note:
‘Peserta dapat mengembangkan aplikasi mobile (IOS dan Android) menggunakan flutter,\nPeserta memahami konsep pengembangan aplikasi menggunakan flutter,\nPeserta dapat menjalankan aplikasi mobile di IOS dan Android ataupun Emulator,\nPeserta memahami bahasa pemrograman Dart,\nPeserta dapat mendevelop aplikasi mobile menggunakan flutter dan dart dari dasar secara berurutan.’,
updatedAt: DateTime.parse(‘2021-05-20 20:53:33’),
createdAt: DateTime.parse(‘2021-05-20 20:53:33’),
),
Note(
id: ‘N3’,
title: ‘Belajar Flutter di ITBOX’,
note: ‘Jangan lupa belajar flutter dengan video interactive di ITBOX.’,
updatedAt: DateTime.parse(‘2021-05-20 21:22:33’),
createdAt: DateTime.parse(‘2021-05-20 21:22:33’),
),
Note(
id: ‘N4’,
title: ‘Resep nasi goreng’,
note:
‘Nasi putih 1 piring\nBawang putih 2 siung, cincang halus\nKecap manis atau kecap asin sesuai selera\nSaus sambal sesuai selera\nSaus tiram sesuai selera\nGaram secukupnya\nKaldu bubuk rasa ayam atau sapi sesuai selera\nDaun bawang 1 batang, cincang halus\nTelur ayam 1 butir\nSosis ayam 1 buah, iris tipis\nMargarin atau minyak goreng 3 sdm.’,
updatedAt: DateTime.parse(‘2021-05-20 21:51:33’),
createdAt: DateTime.parse(‘2021-05-20 21:51:33’),
),
];Future<void> getAndSetNotes() async {
_notes = await NoteApi().getAllNote();
notifyListeners();
}List<Note> get notes {
// mengurutkan note ( yang di pin ditampilkan lebih dahulu)
List<Note> tempListNote = _notes.where((note) => note.isPinned).toList();
tempListNote.addAll(_notes.where((note) => !note.isPinned).toList());
return tempListNote;
}// menambahkan toogleIspinned untuk merubah isPinned yang true ke false dan sebaliknya
void toogleIspinned(String id) {
// menampung atau mencari note dengan id yang sama
int index = notes.indexWhere((note) => note.id == id);
// melakukan validasi
if (index >= 0) {
_notes[index].isPinned = !_notes[index].isPinned;
// tambahkan notifier untuk memberi tau widget yang listen ke provider bahwa data sudah berubah
notifyListeners();
}
}// 1. fungsi addNote untuk menambahkan note ke provider
Future<void> addNote(Note note) async {
// 2. panggil fungsi postNote dan tambahkan await, future dan async
// 3. tampung return id dari API dengan membuat String id:
String id = await NoteApi().postNote(note);
// 4. sebelum tambahkan notes ke dalam _notes buat note.copyWith(id: id saat kita post)
note = note.copyWith(id: id);
_notes.add(note);
notifyListeners();
}Note getNote(String id) {
return _notes.firstWhere((note) => note.id == id);
}// Fungsi untuk update
Future<void> updateNote(Note newNote) async {
// sebelum updateNote ke dalam listnote panggil dulu fungsi NoteApi
await NoteApi().updateNote(newNote);
int index = _notes.indexWhere((note) => note.id == newNote.id);
_notes[index] = newNote;
notifyListeners();
}// fungsi untuk delete note ketika di swap kiri atau kanan
void deleteNote(String id) {
_notes.removeWhere((note) => note.id == id);
notifyListeners();
}
}June 30, 2022 at 3:29 PM #51261detail kode nya ada disini coach : https://github.com/Vram-AH/aplikasi-notes-flutter/tree/master/lib
July 1, 2022 at 4:52 PM #51406AnonymousHallo,
ini aku lihat code kamu masalahnya ada di function submitNote() di file add_or_detail_screen.dart
`void submitNote() {
_formKey.currentState.save();
final now = DateTime.now();
_note = _note.copyWith(updatedAt: now, createdAt: now);
final notesProvider = Provider.of<Notes>(context, listen: false);
if (_note.id == null) {
notesProvider.addNote(_note);
} else {
notesProvider.updateNote(_note);
}
notesProvider.addNote(_note); // bagian ini yang menyebabkan keinsert 2x dan menginsert note baru saat update
Navigator.of(context).pop();
}`nah di sana kalau kamu lihat, kamu sudah menvalidasi if(_note.id == null) kamu panggil function addNote, tapi klo gk null maka panggil function updateNote.
Kalau sudah ada itu kamu tidak perlu menambhkannotesProvider.addNote(_note)setelah validasinya karena akan jadi keinsert lagi.July 1, 2022 at 8:04 PM #51428iya sudah bisa coach terimaksih..
July 15, 2022 at 11:00 AM #51693AnonymousSama-sama
-
AuthorPosts
- You must be logged in to reply to this topic.