如何在不使用 build 中指定的参数的情况下从 Riverpod 内部的通知程序提供者调用方法

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

我有这个代码

@riverpod
class MoodNotifier extends _$MoodNotifier {
  @override
  Future<MoodType?> build(DateTime date) async {
    final healthService = ref.watch(healthServiceProvider);
    final response = await healthService.moodDateGet(
      date: DateFormat('yyyy-MM-dd').format(date),
    );
    MoodType? mood = MoodType.values
        .firstWhereOrNull((element) => element.text == response.body);
    return mood;
  }

  Future postMood(MoodType moodType) async {
    final healthService = ref.watch(healthServiceProvider);
    final response = await healthService.moodPost(
        body: UserMoodRequest(
      moodType: moodType.toUserMoodReq,
    ));
    log(response.toString());
    Logger.root.log(Level.INFO, response);
  }
}

所以当我打电话给 postMood 时,我需要写一些类似的东西

ref.read(moodNotifierProvider(DateTime.now()).notifier).postMood(MoodType.happy);

所以我想避免使用每当我使用其他方法时传递的日期参数..我怎样才能用 Riverpod 做到这一点

flutter dart riverpod riverpod-generator
1个回答
0
投票

一般来说,这就是使用参数的全部意义,这样您的供应商就会根据参数变得个性化。

但是,您可以使用简单的提供程序(

Provider
StateProvider
)来存储所需的日期:

例如:

final dateProvider = Provider<DateTime>((ref) => DateTime.now());

然后在

build
方法中:

@riverpod
class MoodNotifier extends _$MoodNotifier {
  @override
  Future<MoodType?> build() async {
    final healthService = ref.watch(healthServiceProvider);

    final date = ref.watch(dateProvider); // <-- here
    final response = await healthService.moodDateGet(
      date: DateFormat('yyyy-MM-dd').format(date),
    );
    MoodType? mood = MoodType.values
        .firstWhereOrNull((element) => element.text == response.body);
    return mood;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.