При смене экрана/страницы отображается только один элемент списка

На экране добавления веса я выбираю вес и дату, а затем они сохраняются в списке в базе данных Hive, как только я нажимаю «Сохранить». Это также возвращает меня на домашнюю страницу, где я хотел бы изобразить сохраненные элементы списка в виде ListView.Builder. Я получаю только последний элемент в списке, а не весь список. Когда я нахожусь на экране добавления веса, я вижу, что в списке есть еще элементы, но когда я возвращаюсь на домашнюю страницу, существует только последний.

AddWeightScreen

import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:intl/intl.dart';
import 'package:weighty/components/my_alert_box.dart';
import 'package:weighty/data/database.dart';
import 'package:weighty/screens/home_page.dart';

class AddWeight extends StatefulWidget {
  const AddWeight({super.key});

  @override
  State<AddWeight> createState() => _AddWeightState();
}

class _AddWeightState extends State<AddWeight> {
  Database db = Database();
  final _myBox = Hive.box("mybox");
  double _currentValue = 0;
  DateTime _dateTime = DateTime.now();
  String formattedDate = DateFormat('d MMM yyyy').format(DateTime.now());
  final _weightController = TextEditingController();

  void _showDatePicker() {
    showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(2000),
      lastDate: DateTime.now(),
    ).then((value) {
      setState(() {
        _dateTime = value!;
        formattedDate = DateFormat('d MMM yyyy').format(_dateTime);
      });
    });
  }

// add weight from text -  keyboard
  void _dialogNumber() {
    showDialog(
        context: context,
        builder: (context) {
          return MyAlertBox(
              controller: _weightController,
              hintText: "Enter today's weight...",
              onSave: () {
                if (double.parse(_weightController.text) > 200) {
                  _weightController.text = "200";
                }
                setState(() {
                  _currentValue = double.parse(_weightController.text);
                });

                _weightController.clear();
                Navigator.pop(context);
              },
              onCancel: cancelDialogBox);
        });
  }

  //save method
  void _saveWeightAndDate() {
    setState(() {
      db.weightList.add([_currentValue, formattedDate]);
    });
    db.saveData();

    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => const HomePage(),
      ),
    );
  }

  // cancel new weight input
  void cancelDialogBox() {
    // clear textfield
    _weightController.clear();

    // pop dialog box
    Navigator.of(context).pop();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFFD9F0FF),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          children: [
            const SizedBox(
              height: 28.0,
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                const Text(
                  "Add Weight",
                  style: TextStyle(fontSize: 36, fontWeight: FontWeight.w600),
                ),
                MaterialButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  child: const Text(
                    'CANCEL',
                    style: TextStyle(
                      color: Color(0xff878472),
                      fontSize: 16.0,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 30),
            Expanded(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Expanded(
                    child: MaterialButton(
                      onPressed: _dialogNumber,
                      child: Text(
                        _currentValue.toStringAsFixed(2) + " kg",
                        style: TextStyle(
                            color: Color(0xFF006B8F),
                            fontSize: 46,
                            fontWeight: FontWeight.w500),
                      ),
                    ),
                  ),
                  const SizedBox(height: 30),
                  Slider(
                    value: _currentValue,
                    min: 0,
                    max: 200,
                    onChanged: ((value) {
                      setState(() {
                        _currentValue = value;
                      });
                    }),
                  ),
                  const SizedBox(height: 30),
                  TextButton.icon(
                    onPressed: _showDatePicker,
                    icon: const Icon(
                      Icons.date_range_outlined,
                      size: 24.0,
                      color: Color(0xff878472),
                    ),
                    label: Text(
                      formattedDate,
                      style: TextStyle(color: Color(0xff878472), fontSize: 18),
                    ),
                  ),
                  const SizedBox(height: 30),
                  ElevatedButton(
                    onPressed: _saveWeightAndDate,
                    child: Text(
                      'SAVE',
                      style:
                          TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
                    ),
                    style: ElevatedButton.styleFrom(
                      elevation: 24,
                      padding:
                          EdgeInsets.symmetric(vertical: 20, horizontal: 80),
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(30),
                        side: BorderSide(color: Colors.white, width: 2),
                      ),
                    ),
                  ),
                  const SizedBox(height: 30),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Домашняя страница

import 'package:flutter/material.dart';

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:weighty/components/weight_tile.dart';
import 'package:weighty/data/database.dart';
import 'package:weighty/main.dart';
import 'package:weighty/screens/add_weight.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    //First time ever opening app, Create default data
    // if (_myBox.get("WEIGHTLIST") == null) {

    // }

    //already exists data

    db.loadData();

    // db.saveData();

    super.initState();
  }

  Database db = Database();
  final _myBox = Hive.box("mybox");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[100],
      floatingActionButton: FloatingActionButton(
        backgroundColor: Color(0xff006B8F),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => const AddWeight(),
            ),
          );
        },
        child: const Icon(Icons.add),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            SizedBox(height: 28),
            Text(
              "CURRENT",
              style: TextStyle(
                color: Colors.grey[500],
                fontSize: 16.0,
                fontWeight: FontWeight.bold,
              ),
            ),
            Text(
              db.weightList.length == 0
                  ? "00.0 Kg"
                  : db.weightList.last[0].toStringAsFixed(2) + " kg",
              style: TextStyle(
                color: Color(0xFF006B8F),
                fontSize: 46.0,
                fontWeight: FontWeight.bold,
              ),
            ),
            SizedBox(height: 40),
            Center(
              child: Text(
                "GRAPH",
                style: TextStyle(
                  fontSize: 16.0,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
            Expanded(
              child: ListView.builder(
                itemCount: db.weightList.length,
                itemBuilder: (context, index) {
                  return WeightTile(
                    date: db.weightList[index][1],
                    weight: db.weightList[index][0].toStringAsFixed(2),
                  );
                },
              ),
            ),
            ElevatedButton(
                onPressed: () {
                  print(db.weightList.length);
                },
                child: Text('Print!')),
          ],
        ),
      ),
    );
  }
}

База данных улья

import 'package:hive_flutter/hive_flutter.dart';

class Database {
  //reference the box
  final _myBox = Hive.box("mybox");

  // Empty Weight List
  List weightList = [];

  // void createInitialData() {
  //   weightList = [];
  // }

  //load the date from the db
  void loadData() {
    weightList = _myBox.get("WEIGHTLIST");
  }

  //save the weight

  void saveData() {
    _myBox.put("WEIGHTLIST", weightList);
  }
}
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
0
0
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для всего списка вы должны сначала получить старый список, который сохраняется в улье, затем просуммировать этот список и сохранить в улье. Выход

Например, вам нужно обновить метод saveData в класс Database

 void saveData() {
    final myBox = Hive.box("mybox");

    List? hiveList = [];
    hiveList = myBox.get("WEIGHTLIST") ?? [];
    if (hiveList!.isNotEmpty) {
      hiveList += weightList;
    } else {
      hiveList = weightList;
    }
_myBox.put("WEIGHTLIST", hiveList);

}

Вы получите весь список на рабочем столе

Спасибо за ответ. Когда я реализую ваш код, я получаю эту ошибку: ════════ Исключение, пойманное жестом ═══════════════ Во время обработки жеста возникла следующая ошибка _TypeError: тип «Null» не является подтипом типа «List<dynamic>». stack #0 Database.saveData package:weighty/data/database.dart:28 #1 _AddWeightState._saveWeightAndDate

Biobrolly 11.01.2023 12:10

@Biobrolly, пожалуйста, удалите старое приложение и установите его снова.

rahulVFlutterAndroid 11.01.2023 12:11

@Biobrolly, ты понял свою проблему?

rahulVFlutterAndroid 11.01.2023 12:13

К сожалению, я получаю ту же ошибку. Это происходит, когда я нажимаю кнопку «Сохранить» на экране «Добавить вес».

Biobrolly 11.01.2023 12:15

После удаления и установки такая же проблема?

rahulVFlutterAndroid 11.01.2023 12:16

Да, я удалил приложение с телефона и установил заново. Сейчас попробую флаттер очистить.

Biobrolly 11.01.2023 12:17

@Biobrolly хорошо, тогда дайте мне знать ... если это все еще не работает

rahulVFlutterAndroid 11.01.2023 12:17

Та же ошибка, к сожалению. Может быть, это связано с начальной загрузкой списка на домашней странице в состоянии initState?

Biobrolly 11.01.2023 12:18

После нажатия кнопки сохранения правильно?

rahulVFlutterAndroid 11.01.2023 12:19

Ошибка при нажатии кнопки сохранения где?

rahulVFlutterAndroid 11.01.2023 12:20

Давайте продолжим обсуждение в чате.

rahulVFlutterAndroid 11.01.2023 12:20

Я не смог перестроить ваш проект для его отладки. так что я как бы стреляю в темноте. есть виджет под названием valuelistenablebuilder, который перестраивается при изменении значения. вы можете установить для своего ящика значение, прослушиваемое этим виджетом, и перестраивать каждый раз, когда в ваш ящик добавляется новое значение. пример можно найти на этой странице

Я пробовал ваш подход, но по какой-то причине я не мог заставить его работать.

Biobrolly 11.01.2023 11:49

Хорошо, если вы хотите, мы можем обсудить это еще немного и попытаться это исправить.

NIMA Shahahmadian 15.01.2023 05:39

Другие вопросы по теме