(سوال تکراری نیست)
سلام و عرض ادب
در صفحه اصلی(home) برنامه من 5 لیست وجود داره که اطلاعاتش رو از سرور میخونم،
به ازای هر لیست یه بیلدر گذاشتم و با buildwhen بهش میگم هر موقع فلان لیست کامل دریافت شد اطلاعات رو نشون بده.
اما مشکل اینکه همزمان 5 لیست رو پر نمیکنه و صفحم کامل لود نمیشه در صورتیکه من طبق آموزش ها کاملا صبر کردم تا دیتا از سرور گرفته بشه:
Widget build(BuildContext context) {
return FutureBuilder(
future: Future.wait([
SlideShowNetwork.isData(),
CourseNetwork.isData(),
CategoryNetwork.isData(),
TeacherNetwork.isData(),
StudentNetwork.isData(),
MainScreen.registerList!
]),
builder: (context, AsyncSnapshot<List<dynamic>> snapshot) {
if (snapshot.data == null) {
return const ShimmerHome();
}
if (snapshot.data![0] == true &&
snapshot.data![1] == true &&
snapshot.data![2] == true &&
snapshot.data![3] == true &&
snapshot.data![4] == true) {
return baseBody();
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return const ShimmerHome();
},
);
و به ازای هر لیست یا ویجت این کد رو نوشتم:
BlocBuilder<HomeBloc, HomeState>(
buildWhen: (previous, current) {
if (current is SlideShowLoadingState ||
current is SlideShowSuccessState ||
current is SlideShowErrorState) {
return true;
} else {
return false;
}
},
builder: (context, state) {
if (state is SlideShowSuccessState) {
return SlideShowWidget(list: state.slideshowList);
} else if (state is SlideShowErrorState) {
return Center(
child: Text(
state.error,
style: const TextStyle(fontSize: 22.0),
),
);
} else if (state is SlideShowLoadingState) {
return CircularProgressIndicator();
} else {
return Center(
child: Text(
'hiiiiiiiiiiiiiii',
style: const TextStyle(fontSize: 22.0),
),
);
}
کلاس event state bloc طبق آموزش نوشته شده،
اینم ازنحوه دریافت اطلاعاتم از سرور(برای یکی از لیست ها:مثلا اسلایدشو)
class SlideShowNetwork {
List<SlideShowModel> slideShowList = [];
static Uri UrlSlideShow = Uri.parse('https://retoolapi.dev/dGDySO/data');
static Future<bool> isData() async {
bool result = false;
await http.get(UrlSlideShow).then(
(response) {
if (response.statusCode == 200) {
List jsonlistSlideShow = convert.jsonDecode(response.body);
if (jsonlistSlideShow.isEmpty) {
result = false;
} else {
result = true;
}
}
},
);
return result;
}
Future<List<SlideShowModel>> getData() async {
slideShowList.clear();
await http.get(UrlSlideShow).then(
(response) {
if (response.statusCode == 200) {
List jsonlistSlideShow = convert.jsonDecode(response.body);
jsonlistSlideShow.forEach((json) {
slideShowList.add(SlideShowModel.fromJson(json));
});
}
},
);
return slideShowList;
}
سلام وقتتون بخیر ، ببینید شما بر اساس هر API باید بیاید و State , Event خودشو بسازید ، Future.wait هم که گذاشتید اینجوریه که همش باید کامل بشه !