【问题标题】:Provider is not working when navigate to new screen导航到新屏幕时提供程序不工作
【发布时间】:2021-07-15 11:02:33
【问题描述】:

我通过提供者实现了身份验证

问题是什么时候第一次通知 myHomeCalss 用户已通过不返回正确页面(MainGui)进行身份验证

SplashPages 是带有按钮的页面继续,并推送登录页面,

登录页面被推送到客户之外

但是当我不通过 SplashPages 时,它的效果很完美

请随意

//启动页面

ContinueButton(
                  onPressed:  (){

                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (_) =>
                              ListenableProvider.value(
                                value: yourModel,
                                child: LoginPage(),
                              ),
                        ),
                      );
                    }

                )

//主要

void main() async {
      setupLocator();
      WidgetsFlutterBinding.ensureInitialized();
      await firebase_core.Firebase.initializeApp();
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => AuthenticationService()),
          ],
          child: MyApp(),
        ),
      );
    }

//我的应用

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: MyHome(),
        builder: (context, child) => Navigator(
              key: locator<DialogService>().dialogNavigationKey,
              onGenerateRoute: (settings) => MaterialPageRoute(
                  builder: (context) => DialogManager(child: child)),
            ));
  }
}

我的家

 Class MyHome extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: FutureBuilder<bool>(
              future: startTime(),
              builder: (BuildContext context, AsyncSnapshot<bool> snapshot2) {
                if (snapshot2.hasData) {
                  if (snapshot2.data) {
                    return SplashPages();
                  } else {
                    return Consumer<AuthenticationService>(builder: (_, auth, __) {
                      if (auth.currentUserr == null) {
                        return LoginPage();
                      } else {
                        return FutureBuilder(
                            future: auth.populateCurrentUser(auth.currentUserr),
                            builder: (context, snapshot) {
                              if (snapshot.hasData) {
                                if (auth.currentUserr.emailVerified) {
                                  return MainGui();
                                } else {
                                  return ValidationMailPage(
                                    email: auth.currentUserr.email,
                                  );
                                }
                              } else
                                return Container(
                                    //     child: Center(
                                    //         child: SpinKitRotatingCircle(
                                    //   color: Colors.white,
                                    //   size: 50.0,
                                    // ))
                                    );
                            });
                      }
                    });
                  }
                } 

【问题讨论】:

  • 那么您面临的问题是什么?
  • 问题是当传递给 splashes-> 登录(验证它的工作但它没有再次重定向到 MainGui°
  • 所以登录后没有导航到主页?
  • 是的,尤其是当我经过启动页面时
  • 如前所述,您可以按照此 SO 帖子中的建议更改您的设计:stackoverflow.com/questions/54377188/…

标签: flutter dart provider


【解决方案1】:

您可以考虑使用 SharedPreferences,您将在其中存储用户(或者可能只是令牌),然后在渲染应用程序之前检查 main 中是否存储了令牌/用户;如果有令牌你登录然后推送到主页,如果没有你直接导航到登录页面。

SharedPrefenreces 是持久化数据存储,即使您重新启动应用程序也会保留,但 Provider 是一种状态管理解决方案,不会在应用程序重新启动之间保留。

这是您可以使用的SharedPreferences 插件。

【讨论】:

  • 感谢您的评论,但我想要提供者的解决方案:)
  • 你不能这样做,提供者永远不会持久化状态。 Provider 将是 SharedPreferences 和您的 UI 之间的层。我的意思是,Provider 将从 SharedPreferences 获取数据,然后将其提供给您的 UI。
猜你喜欢
  • 2020-02-05
  • 2021-07-12
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2021-12-19
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多