Saya sedang membangun Widget saya dari daftar yang telah ditentukan sebelumnya dalam file MyClass yang saya buat. Ini berhasil tetapi saya ingin dapat menyimpan data yang bertahan untuk menambahkan bidang favorit Boolean.

Saya membuat Hive Types/Fields untuk kelas saya, menghasilkan adaptor tipe, dan berhasil memuat kotak Hive saat pertama kali menjalankan aplikasi, dan saya dapat mencetak nilai ke konsol, jadi saya tahu semua data ada di sana dan benar.

Di kelas yang saya miliki, nama, jalur url gambar ke gambar aset dan bidang favorit.

Sebelumnya ketika saya menggunakan daftar untuk mendapatkan data saya, saya bisa mendapatkan URL gambar seperti ini:

Expanded(child: Image.asset(widget.MyClass.imageURL)),

Sekarang saya ingin mendapatkan ini dari kotak Hive

Box<MyClass> box = Hive.box<MyClass>('myClassBox');
//This is where I am stuck
Expanded(child: Image.asset(box.???)),

Saya mencoba box.values.where dan box.get() untuk kemudian masuk ke bidang imageURL. Tetapi get membutuhkan kunci, yang tidak harus saya lewati

Widget build(BuildContext context)

Dan saya kemudian memiliki masalah yang sama ketika mencoba mengakses bidang favorit, yang saya gunakan paket Tombol Favorit (favorite_button 0.0.4). Dan saya kemudian akan memperbarui nilai benar/salah berdasarkan tombol yang disadap.

Jika seseorang dapat mengarahkan saya ke arah yang benar, itu akan sangat bagus.

Terima kasih.

Sunting:

Ini Widgetnya :

Widget build(BuildContext context) => GestureDetector(

    onTap: () => Navigator.of(context).push(MaterialPageRoute(
      builder: (context) => TaskPage(job: widget.job), //Need to get data from Hive now
    )),
    child: Container(
      padding: const EdgeInsets.all(16),
      height: 100,
      decoration: BoxDecoration(
         borderRadius: BorderRadius.circular(16),
      ),
      child: Row(
        children: [
          Expanded(flex: 3, child: buildText()),
          Expanded(child: Image.asset(widget.job.imageUrl)),//Need to get data from Hive now
          GestureDetector(
              child: Icon(
                widget.job.fav ? Icons.favorite : Icons.favorite_border, //Need to get data from Hive now
                
              ),
              onTap: ()  {
                // add/remove from favorites list

              }
          ),

          ],
      ),
    ),
  );

Sunting Kedua: Ini adalah kode yang sama setelah menerapkan saran yang diberikan

Widget build(BuildContext context) => GestureDetector(
    onTap: () => Navigator.of(context).push(MaterialPageRoute(
      builder: (context) => TaskPage(job: Hive.box<Job>('jobBox').get(context)), //This bit is still broken so I need to look at this
    )),

    child: Column(
        children:
        Hive.box<Job>('jobBox').values.toList().map(
                (elementList) => Container(
                padding: const EdgeInsets.all(16),
                height: 100,
                decoration: BoxDecoration(
                  color: white,
                  borderRadius: BorderRadius.circular(16),
                ),
                child: Row(

                    children: [
                    Expanded(flex: 3, child:  Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      elementList.name,
                      style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
                    ),
                    SizedBox(height: 10),

                    //Text('Num tasks in job'),
                  ],
                )),
                Expanded(child: Image.asset(elementList.imageURL)),
                GestureDetector(
                    child: Icon(
                      elementList.fav
                          ? Icons.favorite
                          : Icons.favorite_border,
                      color: elementList.fav ? Colors.red.shade200 : Colors.grey,
                    ),
                    onTap: () {
                        //To do
                    }
                  // )
                ),
        ],
      ),
    ),
  )
      .toList(),
),
);
0
rjh500 10 Mei 2021, 17:10

1 menjawab

Jawaban Terbaik

Dengan asumsi bahwa Anda hanya memiliki 1 data di dalam kotak, Anda dapat mengakses data yang tersimpan seperti ini.

Box<MyClass> box = Hive.box<MyClass>('myClassBox');
if(box.isNotEmpty) {
  final data = box.values.first;
  // use data
} else {
  // empty state
}

Nilai Hive dapat memiliki kunci, tergantung bagaimana Anda menggunakannya. Jika Anda menggunakan box.put(key, value), Anda dapat menggunakan box.get(key) untuk bekerja dengan kunci dan nilai.

Jika Anda menggunakan box.add(value), ia menyimpan data dengan indeks yang ditetapkan secara otomatis mulai dari 0. Jadi Anda dapat menggunakanbox.getAt(index) untuk mendapatkan data dengan indeks.

0
Pionix 10 Mei 2021, 14:36