flutter 如何在设备方向更改时更新状态

jgovgodb  于 2023-05-08  发布在  Flutter
关注(0)|答案(1)|浏览(102)

我试图更新状态,而改变设备方向在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();
          }
        },
      ),
    );
  }
}
brqmpdu1

brqmpdu11#

build方法中使用ref.watch

@override
  Widget build(BuildContext context, WidgetRef ref) {
    final bool keyboardEnabled =
        WidgetsBinding.instance.window.viewInsets.bottom <= 0.0;

    final resize = ref.watch(keyboardResizeNotifier);

    return Scaffold(...)
  }

相关问题