Flutter StateNotifierProvider在应用程序重启之间未保持状态

Flutter StateNotifierProvider在应用程序重启之间未保持状态,flutter,dart,flutter-provider,flutter-state,riverpod,Flutter,Dart,Flutter Provider,Flutter State,Riverpod,在android模拟器以及物理设备上使用和测试 重新启动应用程序后,登录屏幕state值在StateNotifierProvider中不存在,这有什么错 accountSetupProvider的状态默认为简介屏幕。单击介绍屏幕的On Pressed(打开)按钮后,状态更新为登录屏幕,并正确触发重建以显示登录屏幕 但是,在颤振热重启或打开/关闭应用程序后,将显示介绍屏幕,而不是登录屏幕。在重新启动之间,点击介绍屏幕中的“按”按钮后,现在设置为登录屏幕的状态是否应该持续,并导致跳过介绍屏幕和显示登

在android模拟器以及物理设备上使用和测试

重新启动应用程序后,登录屏幕
state
值在StateNotifierProvider中不存在,这有什么错

accountSetupProvider的
状态默认为简介屏幕。单击介绍屏幕的On Pressed(打开)按钮后,
状态更新为登录屏幕,并正确触发重建以显示登录屏幕

但是,在颤振热重启或打开/关闭应用程序后,将显示介绍屏幕,而不是登录屏幕。在重新启动之间,点击介绍屏幕中的“按”按钮后,现在设置为登录屏幕的
状态是否应该持续,并导致跳过介绍屏幕和显示登录屏幕

正如您在下面看到的
main.dart
有一个初始批准。rootroute。在
app\u router.dart
中,此“root”屏幕打开
root\u screen.dart
,这是一个
消费者Widget
,即
监视
(ing)我的状态通知提供者,在
帐户设置\u提供者.dart中称为“accountSetupProvider”

main.dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: AppRoutes.root,
      onGenerateRoute: (settings) => AppRouter.onGenerateRoute(settings),
    );
  }
}
class AppRoutes {
  static const String root = RootScreen.id;
  static const String intro = IntroScreen.id;
  static const String signIn = SignInScreen.id;
}

class AppRouter {
  static Route<dynamic> onGenerateRoute(RouteSettings settings) {
    final _args = settings.arguments;

    switch (settings.name) {
      case AppRoutes.root:
        return MaterialPageRoute<dynamic>(
          builder: (_) => RootScreen(),
          settings: settings,
        );
      case AppRoutes.intro:
        return MaterialPageRoute<dynamic>(
          builder: (_) => IntroScreen(),
          settings: settings,
        );
      case AppRoutes.signIn:
        return MaterialPageRoute<dynamic>(
          builder: (_) => SignInScreen(),
          settings: settings,
        );
    }
  }
}
class RootScreen extends ConsumerWidget {
  const RootScreen({Key key}) : super(key: key);
  static const String id = 'root_screen';

  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final screen = watch(accountSetupProvider.state);

    if (screen == AppRoutes.signIn) {
      return SignInScreen();
    } else if (screen == AppRoutes.intro) {
      return IntroScreen();
    }
  }
}
intro\u屏幕。dart(仅包括intro屏幕的
onPressed
部分,我希望该部分将状态设置为新屏幕,即使在颤振热重启或应用程序重启之后也是如此。)

帐户设置\u提供程序.dart(初始化到
AppRoutes.intro
屏幕。)

类AccountSetupNotifier扩展StateNotifier{
AccountSetupNotifier():super(AppRoutes.intro);
无效设置屏幕(字符串屏幕){
状态=屏幕;
}
}
最终accountSetupProvider=StateNotifierProvider((参考){
返回AccountSetupNotifier();
});

甚至不看你的代码,只看你的主题行,我一点也不惊讶。“热重启”重置所有变量。怎么会有国家保存下来?您是否正在寻找“热重新加载”?

那么在物理设备上重新启动应用程序呢?这不是违背了“国家”的目的吗?我知道热重载保持状态。如果你想要持久状态,你需要将你的值写入数据库或类似的东西。
onPressed: () {
  context
    .read(accountSetupProvider) // see accountSetupProvider StateNotifierProvider below.
    .setScreen(AppRoutes.signIn);
},
class AccountSetupNotifier extends StateNotifier<String> {
  AccountSetupNotifier() : super(AppRoutes.intro);

  void setScreen(String screen) {
    state = screen;
  }
}

final accountSetupProvider = StateNotifierProvider<AccountSetupNotifier>((ref) {
  return AccountSetupNotifier();
});