hive 配置单元数据未更新

roejwanj  于 2023-10-18  发布在  Hive
关注(0)|答案(1)|浏览(189)

这是我的函数来初始化Hive,并把一些虚拟数据里面,如果它是空的,但数据没有得到显示,我弄清楚的是,它甚至没有得到调用热重启或重新加载,甚至没有当我关闭应用程序重建它,唯一的时间,当我可以看到dummyDietPlan的更新值是当我卸载应用程序并再次构建,为什么_initializeHive()在应用的生命周期中只被调用一次?除了这个问题,其他一切工作正常与Hive,但只是不能弄清楚为什么这个问题是来了

  1. void initState() {
  2. super.initState();
  3. _initializeHive();
  4. _checkDietIsViewed();
  5. }
  6. Future<void> _initializeHive() async {
  7. if (!isInitialized) {
  8. await HiveService.initHive();
  9. setState(() {
  10. isInitialized = true;
  11. });
  12. }
  13. }
  14. Future<void> _initializeDummyData() async {
  15. final dietPlans = await HiveService.retrieveDietPlan();
  16. if (dietPlans.isEmpty) {
  17. final dummyDietPlan = DietPlan( ... // dummy diet plan inserted
  18. await HiveService.UpdateDietPlan(dummyDietPlan);
  19. await HiveService.printDietPlans();
  20. }
  21. }
  22. Widget build(BuildContext context) {
  23. return Scaffold(
  24. body: FutureBuilder<List<DietPlan>>(
  25. future: HiveService.retrieveDietPlan(),
  26. builder: (context, snapshot) {
  27. if (snapshot.connectionState == ConnectionState.waiting) {
  28. } else if (snapshot.hasError) {
  29. } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
  30. // Call _initializeHiveAndData() here to handle empty data
  31. _initializeHive();
  32. return Text('No diet plans available.');
  33. } else {
  34. final dietPlans = snapshot.data!;
  35. return ListView.builder(
  36. }
  37. },
  38. ),
  39. );
  40. }
  41. }

this is before reinstallation , just a hot restart
This is after reinstallation of the app
我期待着,当我改变值的虚拟饮食计划,它会反映在我的饮食页面,但它没有

lo8azlld

lo8azlld1#

你遇到这个问题是因为你在Build方法中调用FutureBuilder中的_initializeHive方法,
因此,您必须将_initializeHive和_initializeDummyData移动到initState方法中。
在initState方法中,在Hive初始化后调用_initializeDummyData,
以下是正确代码-

  1. class YourPage extends StatefulWidget {
  2. @override
  3. _YourPageState createState() => _YourPageState();
  4. }
  5. class _YourPageState extends State<YourPage> {
  6. bool isInitialized = false;
  7. @override
  8. void initState() {
  9. super.initState();
  10. _initializeHiveAndData();
  11. _checkDietIsViewed();
  12. }
  13. Future<void> _initializeHiveAndData() async {
  14. if (!isInitialized) {
  15. await HiveService.initHive();
  16. await _initializeDummyData();
  17. setState(() {
  18. isInitialized = true;
  19. });
  20. }
  21. }
  22. Future<void> _initializeDummyData() async {
  23. final dietPlans = await HiveService.retrieveDietPlan();
  24. if (dietPlans.isEmpty) {
  25. final dummyDietPlan = DietPlan(...); // dummy diet plan inserted
  26. await HiveService.UpdateDietPlan(dummyDietPlan);
  27. await HiveService.printDietPlans();
  28. }
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. return Scaffold(
  33. body: FutureBuilder<List<DietPlan>>(
  34. future: HiveService.retrieveDietPlan(),
  35. builder: (context, snapshot) {
  36. if (snapshot.connectionState == ConnectionState.waiting) {
  37. return CircularProgressIndicator();
  38. } else if (snapshot.hasError) {
  39. return Text('Error: ${snapshot.error}');
  40. } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
  41. return Text('No diet plans available.');
  42. } else {
  43. final dietPlans = snapshot.data!;
  44. return ListView.builder(
  45. itemCount: dietPlans.length,
  46. itemBuilder: (context, index) {
  47. // Build your list item here
  48. },
  49. );
  50. }
  51. },
  52. ),
  53. );
  54. }
  55. }
展开查看全部

相关问题