Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 注销按钮只是在当前页面的顶部添加一个新页面_Flutter_Dart - Fatal编程技术网

Flutter 注销按钮只是在当前页面的顶部添加一个新页面

Flutter 注销按钮只是在当前页面的顶部添加一个新页面,flutter,dart,Flutter,Dart,我在我的应用程序中有一个个人资料页面,单击一个注销按钮,我就会显示登录页面 我的代码是这样的 FlatButton( onPressed: () { setState(() { token = null; }); Navigator.of(context).pushRepla

我在我的应用程序中有一个个人资料页面,单击一个注销按钮,我就会显示登录页面

我的代码是这样的

 FlatButton(
                    onPressed: () {
                      setState(() {
                        token = null;
                      });

                      Navigator.of(context).pushReplacement(CupertinoPageRoute(
                        builder: (context) => LoginPage()

                      ));

                    },
                    child: Text(
                      Logout,
                      style: TextStyle(color: Colors.red),
                    ),
                  ),
但它只是在当前页面的顶部添加一个登录页面。因此,如果我从左向右拖动屏幕,它将返回到配置文件页面,如何解决这个问题

看看这个


谢谢

您需要完全清除堆栈,而不仅仅是更换堆栈顶部

您可以这样做:

Navigator.of(context)
  .pushAndRemoveUntil(
    CupertinoPageRoute(
      builder: (context) => LoginPage()
    ),
  (_) => false,
);
第二个参数是当返回true时停止弹出的条件


通过使其始终返回false,您将弹出堆栈的其余部分,只保留当前路由。

您需要完全清除堆栈,而不仅仅是替换堆栈顶部

您可以这样做:

Navigator.of(context)
  .pushAndRemoveUntil(
    CupertinoPageRoute(
      builder: (context) => LoginPage()
    ),
  (_) => false,
);
第二个参数是当返回true时停止弹出的条件

通过使其始终返回false,您将弹出堆栈的其余部分,只保留当前路由。

Hy Harish

要在登录后在页面之间切换,我将使用
provider

步骤到步骤:

▶ 在应用程序
pubspec.yaml
文件中安装提供商

dependencies:
  path_provider: ^3.1.0+1 // install the last version
有关此软件包的详细信息,请参阅。


▶ 创建一个名为up to you的新dart文件,例如logging_provider.dart,编写如下代码:

import 'package:flutter/material.dart';

class LoggingProvider with ChangeNotifier{

  final bool isLoggedin = false;

  LoggingProvider(this.isLoggedin);

  setRegistrationStatus(bool status){
    isLoggedin = status;
    notifyListeners();
  }
}


▶ 将提供程序添加到main.dart文件中的主类:

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider< LoggingProvider >(
          builder: (_) => LoggingProvider(true), // here you can give him a status before abb is complied
        ),
      ],
      child: MaterialApp(
        home: Provider.of< LoggingProvider >(context).isLoggedin? // if isLoggedin setted as true show Home else show LoginPage
                                                        HomePage() : // as example
                                                        LoginPage(),
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
ChangeNotifierProvider(
生成器:()=>LoggingProvider(true),//在abb被遵从之前,您可以在这里给他一个状态
),
],
孩子:MaterialApp(
home:Provider.of(context).isLoggedin?//如果isLoggedin设置为true,则显示home,否则显示LoginPage
HomePage()://作为示例
LoginPage(),
),
);
}
}


▶ 从注销按钮设置登录状态,如下所示:

 FlatButton(
  onPressed: () => Provider.of<LoggingProvider>(context).setRegistrationStatus(false),
  ...
FlatButton(
onPressed:()=>Provider.of(context).setRegistrationStatus(false),
...


我希望我能帮助您完成这个小代码示例。

Hy Harish

要在登录后在页面之间切换,我将使用
provider

步骤到步骤:

▶ 在应用程序
pubspec.yaml
文件中安装提供商

dependencies:
  path_provider: ^3.1.0+1 // install the last version
有关此软件包的详细信息,请参阅。


▶ 创建一个名为up to you的新dart文件,例如logging_provider.dart,编写如下代码:

import 'package:flutter/material.dart';

class LoggingProvider with ChangeNotifier{

  final bool isLoggedin = false;

  LoggingProvider(this.isLoggedin);

  setRegistrationStatus(bool status){
    isLoggedin = status;
    notifyListeners();
  }
}


▶ 将提供程序添加到main.dart文件中的主类:

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider< LoggingProvider >(
          builder: (_) => LoggingProvider(true), // here you can give him a status before abb is complied
        ),
      ],
      child: MaterialApp(
        home: Provider.of< LoggingProvider >(context).isLoggedin? // if isLoggedin setted as true show Home else show LoginPage
                                                        HomePage() : // as example
                                                        LoginPage(),
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
ChangeNotifierProvider(
生成器:()=>LoggingProvider(true),//在abb被遵从之前,您可以在这里给他一个状态
),
],
孩子:MaterialApp(
home:Provider.of(context).isLoggedin?//如果isLoggedin设置为true,则显示home,否则显示LoginPage
HomePage()://作为示例
LoginPage(),
),
);
}
}


▶ 从注销按钮设置登录状态,如下所示:

 FlatButton(
  onPressed: () => Provider.of<LoggingProvider>(context).setRegistrationStatus(false),
  ...
FlatButton(
onPressed:()=>Provider.of(context).setRegistrationStatus(false),
...



我希望我能帮助你完成这个小的代码示例。

嗨,谢谢分享知识。它按预期工作!嗨,它对android非常有效,但对iOS来说仍然是一样的,iOS平台是否需要任何更改?我不知道。你在使用CupertinoApp或MaterialApp吗?嗨,它现在工作了,我忘记在我所在的位置添加代码了检查平台是否是iOS,这就是为什么它不适用于iOS。谢谢!嗨,谢谢分享知识。它按预期工作!嗨,它适用于android,但对于iOS它仍然是一样的,iOS平台需要任何更改吗?我不知道。你在使用CupertinoApp或MaterialApp吗?嗨,它正在工作,我忘了登广告了d我检查平台是否为iOS的代码,这就是为什么它不适用于iOS的原因。谢谢!嗨,哈利勒,谢谢你的分享,我一定会通过的。嗨,哈利勒,谢谢你的分享,我一定会通过的