Flutter 将动态快照传递到另一个页面

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

我有一个页面,我可以在其中获取作为 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:除了构建器小部件之外,我无法在其他地方获取此快照的值。例如,如果我尝试在导航功能上打印快照值,我会得到“...的实例”

如果有人可以帮助我/或给我提示,我将不胜感激。 :-)

我尝试将快照放在最终对象上,然后在我的导航功能上使用,但没有成功。 我尝试了很多事情..但我并没有从这一切中得到一切。我是颤振新手。

flutter list navigation future snapshot
1个回答
0
投票

您似乎想获取一次数据,然后在不同页面上使用此获取的数据,而无需再次发出网络请求。您可以在此处使用的一种方法是使用状态管理解决方案,例如 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 访问数据。

这样,您只需获取一次数据,将其存储在控制器中,并且可以在不同的小部件之间使用它而无需重新获取。如果您不想在整个应用程序生命周期中保留数据,请记住正确处理控制器的处置。

© www.soinside.com 2019 - 2024. All rights reserved.