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