我必须管理到Flutter 翼应用程序的两个身份验证. 主要是使用Firebase身份验证进行维护. 对于另一个,我用我的OtherUser对象创建了一个AsyncNotifier.

这里的 idea 是通过所有应用程序保持目前的OtherUser.

以下是我的想象:

import 'package:hooks_riverpod/hooks_riverpod.dart';

class PatientController extends AsyncNotifier<Patient?> {
  PatientController();

  bool firstBuild = true;
  static PatientController patientController = PatientController();

  @override
  Future<Patient?> build() async {
    return null;
  }

  void logInPatient({
    required String firstName,
    required String lastName,
    required DateTime birthday,
  }) async {
    
    state = const AsyncLoading();
    state = await AsyncValue.guard(() async {
      final patient = await ref.read(repositoryProvider).getPatient(
            firstName: firstName,
            lastName: lastName,
            birthday: birthday,
          );
      return patient;
    });
  }

  void createPatient(
      {required String firstName,
      required String lastName,
      required DateTime birthday,
      }) async {
    state = const AsyncLoading();
    state = await AsyncValue.guard(() async {
      final patient = await ref.read(repositoryProvider).createPatient(
            firstName: firstName,
            lastName: lastName,
            birthday: birthday,
          );
      ref.read(routerProvider).go('/doctor/patient/home');
      return patient;
    });
  }

  void updatePatient(
      {required String firstName,
      required String lastName,
      required DateTime birthday,}) {
    update((data) async {
      state = const AsyncLoading();
      final patient = data!.copyWith(
        firstName: firstName,
        lastName: lastName,
        birthday: birthday,
      );

      await ref.read(repositoryProvider).updatePatient(patient: patient);
      return patient;
    });
  }

  void logPatientOut() {
    update((data) {
      // do stuff
      return null;
    });
  }

}

final patientControllerProvider =
    AsyncNotifierProvider<PatientController, Patient?>(
        () => PatientController.patientController);

最后,它是一种独生子女.

它在起作用,但我显然不确定这是不是最佳实践. 否则,它将始终调用rebuild,我应该将一个字符串作为id传递,以通过应用程序获取id.

你知道我该怎么做吗?

推荐答案

为什么不这样做呢:

final patientControllerProvider =
    AsyncNotifierProvider<PatientController, Patient?>(PatientController.new);

您的build()方法为空,并且没有依赖项.除非您决定对整个容器显式调用invalidate/refreshdispose(),否则它不会重新构建.此外,您没有应用autoDispose修改器,因此patientControllerProvider修改器将不会被释放.

Flutter相关问答推荐

Flutter bloc -如何使用BlocBuilder?

无法让Riverpod Stream发出新值

Flutter 翼doctor 显示的错误,我似乎不能修复.问题:系统32、Android工具链、Windows 10 SDK

我想在Flutter中画一个箭头,但我似乎无法填满空间

我怎样才能go 掉这个底部导航栏上的白色背景

我想创建一个可滚动的堆叠列表项,每个项都朝向屏幕

DART:如何判断有时可以为空的泛型类型?

如何更改Flutter 中文本的混合模式?

运行任何 flutter 命令都会显示无法安装 <版本>

如何从Firebase登录获取用户信息,如电话号码、出生日期和性别

文本溢出文本框 - Flutter

在 Flutter 中更改喜欢按钮的 colored颜色

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

如何防止键盘将内容向上推?

Flutter RIverpod 奇怪地改变状态

如何建立最近的文件列表?

SfCircularChart 周围的额外间距

在 flutter 中自定义 agora 视频通话 UI

Flutter 在气泡聊天消息上对齐时间戳文本

这在Flutter 的 pubspec 文件中是什么意思?