当它的状态从UserState对象改变时,Riverpods listen()不被调用



我正在听我的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);
}

相关内容

  • 没有找到相关文章

最新更新