Мне нужно управлять аутентификацией Two в приложении Flutter.
Основной из них — поддержка аутентификации firebase.
Для другого я создал AsyncNotifier с моим OtherUser объектом.
Идея здесь состоит в том, чтобы поддерживать во всем приложении этот текущий 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);
Наконец, это своего рода синглтон.
Это работает, но я явно не уверен, что это лучшая практика. В противном случае он всегда будет вызывать перестроение, и я должен передать строку в качестве идентификатора, чтобы получить идентификатор во всем приложении.
Вы хоть представляете, как мне этого добиться?





Почему бы не сделать так:
final patientControllerProvider =
AsyncNotifierProvider<PatientController, Patient?>(PatientController.new);
Ваш метод build() пуст и не имеет зависимостей. Он не будет перестроен, если вы не решите явно вызвать invalidate/refresh или вызвать dispose() для всего контейнера. Кроме того, вы не применяете модификатор autoDispose, поэтому patientControllerProvider не будет удален.
добавьте ref.onDispose((){print('been Dispose');}); к провайдеру для легкой отладки
Он никогда не утилизируется, пока приложение запущено и работает? Это я так думал Но я пробовал и не получается так как я хотел. я попробую снова