Hive 数据未更新

问题描述 投票:0回答:1

这是我初始化 Hive 的函数,如果它是空的,则在其中放入一些虚拟数据,但是数据不会显示,我发现它甚至不会在热重启或重新加载时被调用,即使我关闭应用程序重建它,唯一一次我可以看到 dummyDietPlan 的更新值是当我卸载应用程序并再次构建它时,为什么 _initializeHive() 在应用程序的生命周期中只被调用一次? 除了这个问题之外,其他一切都可以在 hive 上正常工作,但就是不明白为什么会出现这个问题

void initState() {
    super.initState();
    _initializeHive();
    _checkDietIsViewed();
  }

  Future<void> _initializeHive() async {
    if (!isInitialized) {
      await HiveService.initHive();
      setState(() {
        isInitialized = true;
      });
    }
  }

  Future<void> _initializeDummyData() async {
    final dietPlans = await HiveService.retrieveDietPlan();
    if (dietPlans.isEmpty) {
      final dummyDietPlan = DietPlan( ... // dummy diet plan inserted
      await HiveService.UpdateDietPlan(dummyDietPlan);
      await HiveService.printDietPlans();
    }
  }
  
   Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<DietPlan>>(
        future: HiveService.retrieveDietPlan(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
          } else if (snapshot.hasError) {
          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
            // Call _initializeHiveAndData() here to handle empty data
           _initializeHive();
            return Text('No diet plans available.');
          } else {
            final dietPlans = snapshot.data!;
            return ListView.builder(
          }
        },
      ),
    );
  }
}

this is before reinstallation , just a hot restart

This is after reinstallation of the app

我原以为当我更改虚拟饮食计划的值时,它会反映在我的饮食页面上,但事实并非如此

database flutter hive
1个回答
0
投票

您遇到此问题是因为您在 Build 方法中调用 FutureBuilder 中的 _initializeHive 方法,

因此,您必须将 _initializeHive 和 _initializeDummyData 移至 initState 方法。

在 initState 方法中,在 Hive 初始化后调用 _initializeDummyData ,

这是正确的代码-

class YourPage extends StatefulWidget {
  @override
  _YourPageState createState() => _YourPageState();
}

class _YourPageState extends State<YourPage> {
  bool isInitialized = false;

  @override
  void initState() {
    super.initState();
    _initializeHiveAndData();
    _checkDietIsViewed();
  }

  Future<void> _initializeHiveAndData() async {
    if (!isInitialized) {
      await HiveService.initHive();
      await _initializeDummyData();
      setState(() {
        isInitialized = true;
      });
    }
  }

  Future<void> _initializeDummyData() async {
    final dietPlans = await HiveService.retrieveDietPlan();
    if (dietPlans.isEmpty) {
      final dummyDietPlan = DietPlan(...); // dummy diet plan inserted
      await HiveService.UpdateDietPlan(dummyDietPlan);
      await HiveService.printDietPlans();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<DietPlan>>(
        future: HiveService.retrieveDietPlan(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return CircularProgressIndicator();
          } else if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
            return Text('No diet plans available.');
          } else {
            final dietPlans = snapshot.data!;
            return ListView.builder(
              itemCount: dietPlans.length,
              itemBuilder: (context, index) {
                // Build your list item here
              },
            );
          }
        },
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.