Flutter 重新登录它不会定向到预期的主页

Flutter re-login it does not directs to the intended home page

Flutter Logout 指向登录页面,但在重新登录后它不会重定向到预期的主页。

我已经使用下面的导航进行登录

Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));

我的应用程序由三个底部导航栏组成 bar.Home 页面在第二个导航栏中。我必须从第三个导航栏注销。

我已经使用下面的代码注销

Navigator.pushNamedAndRemoveUntil(context, '/Login', (_) => false);

我也试过密码

 Navigator.popAndPushNamed(context, "/Login");


Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => Login(),), (Route route) => false);

请帮我找到解决办法。

尝试使用共享首选项存储为登录密钥并检查是否为真然后转到主屏幕或重定向到登录屏幕。

首先在你的 pubspec.yaml

中添加共享偏好依赖
dependencies:
  flutter:
    sdk: flutter

  shared_preferences: ^0.5.6+2

SplashScreen.dart

这是我们检查 isLogin 是否为真 的第一个屏幕,然后转到 HomeScreenelse 重定向到 LoginScreen

_autoLogin() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  if (!prefs.containsKey('isLogin')) {
    prefs.setBool('isLogin', false);
  }
  if (prefs.getBool('isLogin')) {
    Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => HomeScreen(),
        ));
  } else {
    Navigator.pushReplacement(
        context,
        MaterialPageRoute(
          builder: (context) => LoginScreen(),
        ));;
  }
}

LoginScreen.dart

_setIsLogin() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setBool('isLogin', true);
  Navigator.pushReplacement(
      context,
      MaterialPageRoute(
        builder: (context) => HomeScreen(),
      ));
}


MaterialButton(
  minWidth: MediaQuery.of(context).size.width,
  padding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
  onPressed: () {
    _setIsLogin();
  },
  child: Text("LOGIN",
      textAlign: TextAlign.center,
      style: style.copyWith(
          color: Colors.white,
          fontWeight: FontWeight.bold,
          fontSize: 18.0)),
),

HomeScreen.dart

当点击注销

时,将isLogin设置为false
_logout() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setBool('isLogin', false);
  Navigator.pushReplacement(
      context,
      MaterialPageRoute(
        builder: (context) => LoginScreen(),
      ));
}

希望对您有所帮助!

这是我的启动画面

    class SplashState  extends State<SplashScreen>{
  bool isLogged = false;
  startTime(){
    return new Timer(Duration(milliseconds: 3000), navigateUser);
  }

  @override
  void initState() {
    super.initState();
    getStoredValue();
    }


  void getStoredValue() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    if (!prefs.containsKey('isLoggin')) {
      prefs.setBool('isLoggin', false);
      print("login set to False");
    }


    isLogged = prefs.getBool('isLoggin');
    print("Status in splash -----------$isLogged");
    startTime();
  }

  @override
  Widget build(BuildContext context) {
  SystemChrome.setEnabledSystemUIOverlays([]);
    return  Container(
        height: double.infinity,
        width: double.infinity,
        decoration: BoxDecoration(
          gradient:LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
            colors: <Color>[
             colorStyle.splashPink,
             colorStyle.splashOrange,
            ],
          )
        ),
        child: Center(
          child:  Image.asset("assets/images/splash_logo.png", height: 85.0),
        ),
    );
  }

  void navigateUser() {
    if (isLogged == true) {
    Navigator.of(context).pushReplacement(
        PageRouteBuilder(pageBuilder: (_, __, ___) => Home()));
    }
    else {
      Navigator.of(context).pushReplacement(
          PageRouteBuilder(pageBuilder: (_, __, ___) => Login()));
    }
    }
}

注销

     void logoutUser()async{
    LogoutUser objLog = await createPost(logoutUrl,body);
    if(objLog.statusCode == 10000){
      print(("response is $resp"));
      SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setBool('isLoggin', false);
       Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()));
    }
    else showToast(objLog.message, duration: Toast.LENGTH_LONG);
  }