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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/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,我想让用户保持登录状态,即使用户关闭应用程序。问题是,如果我关闭应用程序,我会出现在WelcomePage()中,而不是主页() 在main.dart中,initialRoute是WelcomePage(),但我需要在用户注册或登录后更改它。我需要改变什么 以下是我所拥有的: import 'package:flutter/material.dart'; import 'pages/account/WelcomePage.dart'; import 'pages/match/HomePage.d

我想让用户保持登录状态,即使用户关闭应用程序。问题是,如果我关闭应用程序,我会出现在WelcomePage()中,而不是主页()

在main.dart中,initialRoute是WelcomePage(),但我需要在用户注册或登录后更改它。我需要改变什么

以下是我所拥有的:

import 'package:flutter/material.dart';
import 'pages/account/WelcomePage.dart';
import 'pages/match/HomePage.dart';

void main() => runApp(MyApp());

// Test
class MyApp extends StatelessWidget {
  //
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      //
      initialRoute: WelcomePage.id,
      //
      routes: {
        WelcomePage.id: (context) => WelcomePage(),
        HomePage.id: (context) => HomePage(),
      },
    );
  }
}

编辑:我读到用户必须仍然登录,所以我在这里要做的是检查用户是否为空,然后转到
主页.id
。但要检查用户是否登录,我需要一个
异步
功能,并且
初始路由
不接受
未来
s.

而不是总是直接进入
WelcomePage
,制作一个显示加载指示器的小部件,直到确定登录状态。确定此状态后,您可以基于此状态显示
欢迎页面
主页

此类小部件的一个示例是来自此应用程序的
RootPage
。 文章中的示例:

enum AuthStatus {
  NOT_DETERMINED,
  NOT_LOGGED_IN,
  LOGGED_IN,
}

class RootPage extends StatefulWidget {
  RootPage({this.auth});

  final BaseAuth auth;

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

class _RootPageState extends State<RootPage> {
  AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
  String _userId = "";

  @override
  void initState() {
    super.initState();
    widget.auth.getCurrentUser().then((user) {
      setState(() {
        if (user != null) {
          _userId = user?.uid;
        }
        authStatus =
            user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
      });
    });
  }

  void loginCallback() {
    widget.auth.getCurrentUser().then((user) {
      setState(() {
        _userId = user.uid.toString();
      });
    });
    setState(() {
      authStatus = AuthStatus.LOGGED_IN;
    });
  }

  void logoutCallback() {
    setState(() {
      authStatus = AuthStatus.NOT_LOGGED_IN;
      _userId = "";
    });
  }

  Widget buildWaitingScreen() {
    return Scaffold(
      body: Container(
        alignment: Alignment.center,
        child: CircularProgressIndicator(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    switch (authStatus) {
      case AuthStatus.NOT_DETERMINED:
        return buildWaitingScreen();
        break;
      case AuthStatus.NOT_LOGGED_IN:
        return new LoginSignupPage(
          auth: widget.auth,
          loginCallback: loginCallback,
        );
        break;
      case AuthStatus.LOGGED_IN:
        if (_userId.length > 0 && _userId != null) {
          return new HomePage(
            userId: _userId,
            auth: widget.auth,
            logoutCallback: logoutCallback,
          );
        } else
          return buildWaitingScreen();
        break;
      default:
        return buildWaitingScreen();
    }
  }
}
枚举身份验证状态{
没有决心,
没有登录,
登录,
}
类RootPage扩展了StatefulWidget{
RootPage({this.auth});
最终BaseAuth-auth;
@凌驾
State createState()=>new_RootPageState();
}
类_RootPageState扩展了状态{
AuthStatus AuthStatus=未确定AuthStatus;
字符串_userId=“”;
@凌驾
void initState(){
super.initState();
widget.auth.getCurrentUser().then((用户){
设置状态(){
如果(用户!=null){
_userId=user?.uid;
}
身份=
user?.uid==null?AuthStatus.NOT_LOGGED_IN:AuthStatus.LOGGED_IN;
});
});
}
void loginCallback(){
widget.auth.getCurrentUser().then((用户){
设置状态(){
_userId=user.uid.toString();
});
});
设置状态(){
authStatus=authStatus.LOGGED\u登录;
});
}
void logoutCallback(){
设置状态(){
authStatus=authStatus.NOT\u LOGGED\u IN;
_userId=“”;
});
}
Widget BuildingWaitingScreen(){
返回脚手架(
主体:容器(
对齐:对齐.center,
子对象:CircularProgressIndicator(),
),
);
}
@凌驾
小部件构建(构建上下文){
交换机(身份验证状态){
案例身份。未确定:
返回BuildingWaitingScreen();
打破
案例身份验证状态。未登录:
返回新的LoginSignupPage(
auth:widget.auth,
loginCallback:loginCallback,
);
打破
案例AuthStatus.LOGGED\u登录:
如果(_userId.length>0&&u userId!=null){
返回新主页(
userId:\u userId,
auth:widget.auth,
logoutCallback:logoutCallback,
);
}否则
返回BuildingWaitingScreen();
打破
违约:
返回BuildingWaitingScreen();
}
}
}

用户保持登录状态,直到您将其注销。您必须编写代码来检查这种情况,如副本中所示。