Saat simpan dan update note, note tercipta ganda(jadi dua)

Beranda › Forums › Belajar Flutter Mobile Apps Tingkat Menengah › Saat simpan dan update note, note tercipta ganda(jadi dua)

Viewing 7 posts - 1 through 7 (of 7 total)
  • Author
    Posts
  • #51255
    Vram Adel Handrio
    Participant

      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..

      #51257
      Vram Adel Handrio
      Participant

        KODE 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)}’),
        ),
        ],
        ),
        );
        }
        }

        #51258
        Vram Adel Handrio
        Participant

          CODE 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();
          }
          }

          #51261
          Vram Adel Handrio
          Participant
            #51406
            Anonymous

              Hallo,
              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 menambhkan notesProvider.addNote(_note) setelah validasinya karena akan jadi keinsert lagi.

              #51428
              Vram Adel Handrio
              Participant

                iya sudah bisa coach terimaksih..

                #51693
                Anonymous

                  Sama-sama

                Viewing 7 posts - 1 through 7 (of 7 total)
                • You must be logged in to reply to this topic.
                Shopping cart0
                There are no products in the cart!
                Continue shopping