flutter 在VoidCallback或函数中运行riverpod FutureProvider 'AsyncValue.when'

5vf7fwbs  于 2023-03-19  发布在  Flutter
关注(0)|答案(1)|浏览(185)

我正在尝试更改基于FutureProvider的值,该值在用户按下按钮时触发。
onTap回调函数:

ElevatedButton(
            onPressed: () {
              final promptResp = ref.watch(
                getProvider(
                  Tuple2(
                    '/gen-image',
                    {'prompt': controller.text},
                  ),
                ),
              );

              promptResp.when<void>(data: (value) {
                ref.read(isLoading.notifier).state = false;
                final data = jsonDecode(value.body);
                ref.read(imagesProvider.notifier).state = data;
              }, error: (e, r) {
                return;
              }, loading: () {
                ref.read(isLoading.notifier).state = true;
              });
            },

以及服务提供方:

final getProvider = FutureProvider.family(
    (ref, Tuple2<String?, Map<String, dynamic>?> info) async {
  final path = info.item1;
  final params = info.item2;

  final url = backendUrl().replace(queryParameters: params, path: path);

  final resp = await http.get(url, headers: {
    'X-FIREBASE_TOKEN': await ref.read(authProvider).currentUser!.getIdToken()
  });

  return resp;
});

因此,按下按钮时,loading回调被调用,但接收数据时,data回调未被触发。似乎在重建时,onTap的执行停止。
如何通过按钮触发此回调?
我也使用了AsyncValue.whenData,但是回调仍然没有被触发

mepcadol

mepcadol1#

尝试在回调中使用ref.read

final promptResp = ref.read(
                getProvider(
                  Tuple2(
                    '/gen-image',
                    {'prompt': controller.text},
                  ),
                ),
              );

不要在回调中使用ref.watch,不要在小工具中使用init方法。

相关问题