firebase 获取不同类别Flutter中bool的当前值

t0ybt7op  于 2023-05-18  发布在  Flutter
关注(0)|答案(2)|浏览(136)

我正在用Firebase制作一个Flutter应用程序,我仍然被身份验证卡住了,因为无论我登录还是注册,它都会将我重定向到HomePage()。在我的auth_page.dart类中,我有一个bool showLogin,它在LoginPage和RegisterPage之间切换,我想在我的WidgetTree中访问它,这样当我注册时,它会将我重定向到CreateProfilePage()而不是Home()。
下面是涉及的两个类:

class AuthPage extends StatefulWidget {
  AuthPage({super.key});

  static bool getShowLogin(BuildContext context) {
    final state = context.findAncestorStateOfType<_AuthPageState>();
    return state?.showLogin ?? true;
  }

  @override
  State<AuthPage> createState() => _AuthPageState();
}

final _authKey = GlobalKey<_AuthPageState>();

class _AuthPageState extends State<AuthPage> {
  // show login page initially
  bool showLogin = true;
    void toggleScreens() {
    setState(() {
      showLogin = !showLogin;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (showLogin) {
      return LoginPage(showRegisterPage: toggleScreens,);
    }
    else {
      return RegisterPage(showLoginPage: toggleScreens,);
    }
  }
}

然后呢

class WidgetTree extends StatefulWidget {
  const WidgetTree({Key? key,}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _WidgetTreeState();
}

class _WidgetTreeState extends State<WidgetTree> {

  @override
  Widget build(BuildContext context) {
    bool isLogin = AuthPage.getShowLogin(context);

    return StreamBuilder(
      stream: Auth().authStateChanges,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return isLogin ? HomePage() : CreateProfilePage();
        }
        else {
          return AuthPage();
        }
      },
    );
  }
}

我试着把toggleScreens()直接放在AuthPage中,但是它不再切换页面了

static void toggleScreens(BuildContext context) {
    final state = _authKey.currentState;
    if (state != null) {
      state.setState(() {
        state.showLogin = !state.showLogin;
      });
    }
  }
}

我也试过在AuthPage中这样实现getShowLogin(),但当我注册时,它仍然会将我重定向到HomePage():

static bool getShowLogin() {
    final state = _authKey.currentState;
    return state?.showLogin ?? true;
  }

提前感谢您的帮助!!

nhaq1z21

nhaq1z211#

您需要使用一些状态管理并保存isLogin状态。
您可以自己实现一个,例如ValueNotifier,或者您可以选择使用许多状态管理包解决方案之一,如Riverpod和Bloc,仅举几例。
当然,你可以使用任何一个在那里。

ev7lccsx

ev7lccsx2#

在代码中,您尝试从父小部件(这里是WidgetTree)访问AuthPage的属性。我不认为上下文会向您发送布尔结果:

因此,要实现您想要的目标,最好使用提供商或集团。

下面是使用提供程序的示例代码:

class WidgetTree extends StatelessWidget {
  const WidgetTree({Key? key,}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final authProvider = Provider.of<AuthProvider>(context);

    return StreamBuilder(
      stream: Auth().authStateChanges,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return authProvider.showLogin ? HomePage() : CreateProfilePage();
        }
        else {
          return AuthPage();
        }
      },
    );
  }
}

提供方:

class AuthProvider with ChangeNotifier {
  bool _showLogin = true;

  bool get showLogin => _showLogin;

  void toggleScreens() {
    _showLogin = !_showLogin;
    notifyListeners();
  }
}

AuthPage

class AuthPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<AuthProvider>(
      builder: (context, authProvider, _) {
        if (authProvider.showLogin) {
          return LoginPage(
            showRegisterPage: authProvider.toggleScreens,
          );
        } else {
          return RegisterPage(
            showLoginPage: authProvider.toggleScreens,
          );
        }
      },
    );
  }
}

通过使用提供程序,你可以很容易地得到切换屏幕的布尔结果,就像你想要的那样。

相关问题