我有一个页面,我可以在其中获取作为 Future 返回的快照>。然后在我的小部件上我使用 ListView.builder 来显示数据,这是可以的:
class _DashboardState extends State<Dashboard> {
final controller = Get.put(RaceController());
var currentSliderValue = 20.0.obs;
get snapshot => controller.getAllUsers(currentSliderValue.value);
...
FutureBuilder<List<RaceModel>>(
future: snapshot,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
-->> this part is fine.
然后我向其主体添加了一个 appBar,我想使用相同的快照数据导航到另一个页面:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Racesmap(snap: snapshot)),
);
问题1:触发导航时,每次都会执行快照的请求,这会消耗我的DB中的数据。我只想传递相同的数据。
问题 2:除了构建器小部件之外,我无法在其他地方获取此快照的值。例如,如果我尝试在导航功能上打印快照值,我会得到“...的实例”
如果有人可以帮助我/或给我提示,我将不胜感激。 :-)
我尝试将快照放在最终对象上,然后在我的导航功能上使用,但没有成功。 我尝试了很多事情..但我并没有从这一切中得到一切。我是颤振新手。
您似乎想获取一次数据,然后在不同页面上使用此获取的数据,而无需再次发出网络请求。您可以在此处使用的一种方法是使用状态管理解决方案,例如 GetX。由于您已经在使用 Get.put() 方法,因此您对 GetX 有点熟悉。
这里有一个方法:
1- 在您的RaceController中,您可以有一个变量来存储您获取的数据。
class RaceController extends GetxController {
var raceList = <RaceModel>[].obs;
fetchRaces(double value) async {
raceList.value = await getAllUsers(value);
}
}
2- 在您的主小部件中,您可以使用 RaceController 来获取和存储数据。
class _DashboardState extends State<Dashboard> {
final controller = Get.put(RaceController());
@override
void initState() {
super.initState();
controller.fetchRaces(20.0);
}
...
}
3- 在你的FutureBuilder中,你可以直接使用raceList。
Obx(() {
if (controller.raceList.isNotEmpty) {
return ListView.builder(
itemCount: controller.raceList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(controller.raceList[index].yourFieldName),
);
},
);
} else {
return CircularProgressIndicator();
}
})
4-导航到另一个页面时,您可以传递控制器本身或直接在新页面中访问它。
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Racesmap(controller: controller)),
);
在 Racesmap 小部件中,您可以使用 widget.controller.raceList 访问数据。
这样,您只需获取一次数据,将其存储在控制器中,并且可以在不同的小部件之间使用它而无需重新获取。如果您不想在整个应用程序生命周期中保留数据,请记住正确处理控制器的处置。