我正在听我的Riverpods提供商在我的构建方法,像这样:
ref.listen<UserState>(userProvider, (UserState? prevState, UserState newState) {
print("LISTEN CALLED");
}
我认为应该发生的事情:
每当我用.CopyWith()
更新我的UserState
对象时,">
实际情况:
"听CALLED"只在我的程序开始时打印一次,然后即使UserState
的属性改变了,listen()
也不会再次被调用。
这是更新我的UserState
(从一个按钮)的调用:
onTap: () {
ref.read(userProvider.notifier).logout();
}
这将调用我的数据库和设备存储,然后执行这行代码:
return state = state.copyWith(
newError: true, newLoading: false, newAccessToken: "", newLoggedIn: false);
此状态与按下登出按钮之前的状态不同(例如,loggedIn
为true,accessToken
有一个值)-查看下面的代码以了解它们是什么。
以下是使用Riverpods的实际类,首先:UserState
:
@immutable
class UserState {
const UserState({
this.error = false,
this.accessToken = "",
this.loading = true,
this.loggedIn = false,
});
final bool error;
final String accessToken;
final bool loading;
final bool loggedIn;
UserState copyWith(
{String? newAccessToken, bool? newError, bool? newLoading, bool? newLoggedIn}) {
return UserState(
error: newError ?? error,
accessToken: newAccessToken ?? accessToken,
loading: newLoading ?? loading,
loggedIn: newLoggedIn ?? loggedIn,
);
}
}
接下来,这是我的UserNotifier
类:
class UserNotifier extends StateNotifier<UserState> {
UserNotifier() : super(const UserState());
void logout() {
// ... does lots of calls to database and device storage, then:
return state =
state.copyWith(newError: true, newLoading: false, newAccessToken: "", newLoggedIn: false);
}
}
最后,这是我的提供者:
final userProvider = StateNotifierProvider<UserNotifier, UserState>((ref) {
return UserNotifier();
});
所以,我的问题是,每次我调用这个logout()
方法(如从按钮)我的状态改变,但我的listen()
函数从Riverpods不调用
下面的代码是不调用时,我的状态改变通过任何方法(如我的logout()
),但我需要它:
ref.listen<UserState>(userProvider, (UserState? prevState, UserState newState) {
print("LISTEN CALLED");
}
任何帮助都会非常感激!!
我认为问题在于logout
方法中的return
。
试题:
void logout() {
// ... does lots of calls to database and device storage, then:
state =
state.copyWith(newError: true, newLoading: false, newAccessToken: "", newLoggedIn: false);
}