【发布时间】:2021-05-19 20:42:31
【问题描述】:
使用flutter_riverpod: ^0.12.4 并在安卓模拟器和物理设备上进行测试。
重新启动应用程序后,登录屏幕state 值没有保留在 StateNotifierProvider 中,我做错了什么?
accountSetupProvider 的state 默认为介绍屏幕。单击介绍屏幕的 onPressed 按钮后,state 将更新为登录屏幕,并正确触发重建以显示登录屏幕。
但是,在颤振热重启或打开/关闭应用程序后,会显示介绍屏幕,而不是登录屏幕。 state(在介绍屏幕中单击 onPressed 后现在设置为登录屏幕)不应该在重新启动之间持续存在并导致跳过介绍屏幕并显示登录屏幕吗?
正如您在下面看到的,main.dart 有一个初始 AppRoutes.root 路由。在app_router.dart 中,此“根”屏幕打开root_screen.dart,这是一个ConsumerWidget,即watch(ing) 我的StateNotifierProvider 在account_setup_provider.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),
);
}
}
app_router.dart
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,
);
}
}
}
root_screen.dart
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_screen.dart(仅包括介绍屏幕的onPressed 部分,我希望将状态设置为新屏幕,即使在颤振热重启或应用重启后也是如此。)
onPressed: () {
context
.read(accountSetupProvider) // see accountSetupProvider StateNotifierProvider below.
.setScreen(AppRoutes.signIn);
},
account_setup_provider.dart(初始化到AppRoutes.intro 屏幕。)
class AccountSetupNotifier extends StateNotifier<String> {
AccountSetupNotifier() : super(AppRoutes.intro);
void setScreen(String screen) {
state = screen;
}
}
final accountSetupProvider = StateNotifierProvider<AccountSetupNotifier>((ref) {
return AccountSetupNotifier();
});
【问题讨论】:
标签: flutter dart flutter-provider flutter-state riverpod