我试图更新状态,而改变设备方向在riverpod,但得到一些以下错误
**StateNotifierListenerError(至少'KeyBoardResize'的StateNotifier示例的侦听器在通知程序尝试更新其状态时引发异常。抛出的异常包括:试图在构件树生成时修改提供程序。如果您遇到此错误,可能是您试图在小部件生命周期中修改提供程序,例如但不限于:
- 建造
- 初始状态
- 处置
- didUpdateWidget
- didChangeDepedencies不允许在这些生命周期内修改提供程序,因为这可能导致UI状态不一致。例如,两个小部件可以侦听同一个提供程序,但错误地接收到不同的状态。**
这是逻辑已写
class KeyBoardResize extends StateNotifier<bool> {
KeyBoardResize() : super(false);
changeBool(mode) {
if (mode == Orientation.landscape) {
return state = true;
} else if (mode == Orientation.portrait) {
return state = false;
}
}
}
final keyboardResizeNotifier =
StateNotifierProvider<KeyBoardResize, bool>((ref) => KeyBoardResize());
这就是我在widget中使用的方法
class LoginScreen extends ConsumerWidget {
const LoginScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
final bool keyboardEnabled =
WidgetsBinding.instance.window.viewInsets.bottom <= 0.0;
final resize = ref.read(keyboardResizeNotifier);
return Scaffold(
resizeToAvoidBottomInset: resize,
body: OrientationBuilder(
builder: (context, orientation) {
if (orientation == Orientation.portrait) {
ref.read(keyboardResizeNotifier.notifier).changeBool(orientation);
return portraitMode(context, keyboardEnabled);
} else if (orientation == Orientation.landscape) {
ref.read(keyboardResizeNotifier.notifier).changeBool(orientation);
return landscapeMode(context, keyboardEnabled);
} else {
return Container();
}
},
),
);
}
}
1条答案
按热度按时间brqmpdu11#
在
build
方法中使用ref.watch
: