这是我初始化 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(
}
},
),
);
}
}
我原以为当我更改虚拟饮食计划的值时,它会反映在我的饮食页面上,但事实并非如此
您遇到此问题是因为您在 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
},
);
}
},
),
);
}
}