Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 如何在Flatter中获取用户名和邮件以显示在UserAccountsDrawerHeader中_Flutter - Fatal编程技术网

Flutter 如何在Flatter中获取用户名和邮件以显示在UserAccountsDrawerHeader中

Flutter 如何在Flatter中获取用户名和邮件以显示在UserAccountsDrawerHeader中,flutter,Flutter,我在登录后从URL获取响应,但我只能在控制台中打印数据,但如何从该响应获取邮件和名称 我尝试了未来响应,但当我得到未来响应时,它返回错误 登录页 import 'dart:io'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; imp

我在登录后从URL获取响应,但我只能在控制台中打印数据,但如何从该响应获取邮件和名称

我尝试了未来响应,但当我得到未来响应时,它返回错误

登录页

import 'dart:io';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'globals.dart' as globals;

class LoginPage extends StatefulWidget {
  static String tag = 'login-page';
  @override
  _LoginPageState createState() => new _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  LoginRequestData _loginData = LoginRequestData();


  bool _validate = false;
  bool _obscureText = true;
  var username, password;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // backgroundColor: Colors.white,
      body: SingleChildScrollView(
        child: Container(
          color: Colors.lightGreen[500],
          child: Column(
            children: <Widget>[
              Center(
                child: Container(
                  width: MediaQuery
                      .of(context)
                      .size
                      .width,
                  height: MediaQuery
                      .of(context)
                      .size
                      .height / 2.5,
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                        // begin: Alignment.topCenter,
                        // end: Alignment.bottomCenter,
                          colors: [
                            Color(0xFFFFFFFF),
                            Color(0xFFFFFFFF),
                          ]
                      ),
                      borderRadius: BorderRadius.only(
                          bottomLeft: Radius.circular(90)
                      )
                  ),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Align(
                        alignment: Alignment.center,
                        child: Image.asset('images/ic_launcher1.png'),
                      ),
                    ],
                  ),
                ),
              ),
              Center(
                  child: SingleChildScrollView(
                    child: new Form(
                      key: _formKey,
                      autovalidate: _validate,
                      child: _getFormUI(),
                    ),
                  )
              )

            ],
          ),
        ),
      ),
    );
  }

  Widget _getFormUI() {
    return new Column(
      children: <Widget>[
        SizedBox(height: 24.0),
        Center(
          child: Text('Login',
            style: TextStyle(fontSize: 25,
                fontWeight: FontWeight.bold,
                color: Colors.white),),
        ),
        new SizedBox(height: 25.0),
        new TextFormField(
          keyboardType: TextInputType.emailAddress,
          autofocus: false,
          decoration: InputDecoration(
            hintText: 'Username',
            contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
            border:
            OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
          ),
          validator: _validateName,
          onSaved: (value) {
            _loginData.username = value;
          },
        ),
        new SizedBox(height: 8.0),
        new TextFormField(
            autofocus: false,
            obscureText: _obscureText,
            keyboardType: TextInputType.text,
            decoration: InputDecoration(
              hintText: 'Password',
              contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
              border:
              OutlineInputBorder(borderRadius: BorderRadius.circular(24.0)),
              suffixIcon: GestureDetector(
                child: Icon(
                  _obscureText ? Icons.visibility : Icons.visibility_off,
                  semanticLabel:
                  _obscureText ? 'show password' : 'hide password',
                ),
              ),
            ),
            validator: _validatePassword,
            onSaved: (String value) {
              _loginData.password = value;
            }
        ),
        new SizedBox(height: 15.0),
        new Padding(
          padding: EdgeInsets.symmetric(vertical: 16.0),
          child: RaisedButton(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(24),
            ),
            onPressed: () {
              _submit();
//              Navigator.of(context).pushReplacementNamed('/home');
            },
            padding: EdgeInsets.all(12),
            color: Colors.black54,
            child: Text('Log In', style: TextStyle(color: Colors.white)),
          ),
        ),
        new FlatButton(
          child: Text(
            'Forgot password?',
            style: TextStyle(color: Colors.black54),
          ),
          onPressed: () {},
        ),
        new FlatButton(
          onPressed: _sendToRegisterPage,
          child: Text('Not a member? Sign up now',
              style: TextStyle(color: Colors.black54)),
        ),
        Text(''),
        Text(''),
        Text(''),
      ],
    );
  }

  _sendToRegisterPage() {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => HomeScreen()),
    );
  }

  String _validateName(String value) {
    if (value.isEmpty) {
      return "Username is Required";
    } else {
      username = value.toString();
    }
  }

  String _validatePassword(String value) {
    if (value.isEmpty) {
      return "Password is Required";
    } else {
      password = value.toString();
    }
  }

  _submit() {
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      print("Username ${_loginData.username}");
      print("Password ${_loginData.password}");
      return SessionId();
    } else {
      setState(() {
        bool _validate = false;
      });
    }
  }


  final Dio _dio = Dio();
  PersistCookieJar persistentCookies;
  final String url = "https://www.xxxx.in/rest/user/login.json";

  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    print(directory.path);
    return directory.path;
  }

  Future<Directory> get _localCoookieDirectory async {
    final path = await _localPath;
    final Directory dir = new Directory('$path/cookies');
    await dir.create();
    print(dir);
    return dir;
  }

  Future<String> getCsrftoken() async{
    try {
      String csrfTokenValue;
      final Directory dir = await _localCoookieDirectory;
      final cookiePath = dir.path;
      persistentCookies = new PersistCookieJar(dir: '$cookiePath');
      persistentCookies.deleteAll(); //clearing any existing cookies for a fresh start
      _dio.interceptors.add(
          CookieManager(persistentCookies) //this sets up _dio to persist cookies throughout subsequent requests
      );
      _dio.options = new BaseOptions(
        baseUrl: url,
        contentType: ContentType.json,
        responseType: ResponseType.plain,
        // connectTimeout: 5000,
        // receiveTimeout: 100000,
        headers: {
          HttpHeaders.userAgentHeader: "dio",
          "Connection": "keep-alive",
        },
      ); //BaseOptions will be persisted throughout subsequent requests made with _dio
      _dio.interceptors.add(
          InterceptorsWrapper(
              onResponse:(Response response) {
                List<Cookie> cookies = persistentCookies.loadForRequest(Uri.parse(url));
                csrfTokenValue = cookies.firstWhere((c) => c.name == 'csrftoken', orElse: () => null)?.value;
                if (csrfTokenValue != null) {
                  _dio.options.headers['X-CSRF-TOKEN'] = csrfTokenValue; //setting the csrftoken from the response in the headers
                }
                print(response);
                return response;
              }
          )
      );
      await _dio.get("https://www.xxxx.in/rest/user/login.json");
      print(csrfTokenValue);
      return csrfTokenValue;
    } catch (error, stacktrace) {
      print(error);
//      print("Exception occured: $error stackTrace: $stacktrace");
      return null;
    }
  }

   SessionId() async {
     try {
       final csrf = await getCsrftoken();
       FormData formData = new FormData.from({
         "username": "${_loginData.username}",
         "password": "${_loginData.password}",
         "csrfmiddlewaretoken" : '$csrf'
       });
       Options optionData = new Options(
         contentType: ContentType.parse("application/json"),
       );
       Response response = await _dio.post("https://www.xxxx.in/rest/user/login.json", data: formData, options: optionData);
   Payload payloadFromJson(String str) => 
   Payload.fromJson(json.decode(str));
      String payloadToJson(Payload data) => json.encode(data.toJson());
       if (response.statusCode == 200){
         return Navigator.of(context).pushReplacement(MaterialPageRoute(
             builder: (context) => HomeScreen(),
         ));
       }
       else{
         throw Exception();
       }
     } on DioError catch(e) {
       if(e.response != null) {
         print( e.response.statusCode.toString() + " " + e.response.statusMessage);
         print(e.response.data);
         print(e.response.headers);
         print(e.response.request);
       } else{
         print(e.request);
         print(e.message);
       }
     }
     catch (error, stacktrace) {
       print("Exception occured: $error stackTrace: $stacktrace");
       return null;
     }
   }
}

在注释中查找Json文件,如何解析Json

请将JSON字符串粘贴到
它将提供正确的格式
解析JSON的代码片段

// To parse this JSON data, do
//
//     final payload = payloadFromJson(jsonString);

import 'dart:convert';

Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
    String sessid;
    String sessionName;
    String token;
    User user;

    Payload({
        this.sessid,
        this.sessionName,
        this.token,
        this.user,
    });

    factory Payload.fromJson(Map<String, dynamic> json) => new Payload(
        sessid: json["sessid"],
        sessionName: json["session_name"],
        token: json["token"],
        user: User.fromJson(json["user"]),
    );

    Map<String, dynamic> toJson() => {
        "sessid": sessid,
        "session_name": sessionName,
        "token": token,
        "user": user.toJson(),
    };
}

class User {
    String uid;
    String name;
    String mail;
    String theme;
    String signature;
    String signatureFormat;
    String created;
    String access;
    int login;
    String status;
    String timezone;
    String language;
    String picture;
    Data data;
    String uuid;
    Map<String, String> roles;
    RdfMapping rdfMapping;

    User({
        this.uid,
        this.name,
        this.mail,
        this.theme,
        this.signature,
        this.signatureFormat,
        this.created,
        this.access,
        this.login,
        this.status,
        this.timezone,
        this.language,
        this.picture,
        this.data,
        this.uuid,
        this.roles,
        this.rdfMapping,
    });

    factory User.fromJson(Map<String, dynamic> json) => new User(
        uid: json["uid"],
        name: json["name"],
        mail: json["mail"],
        theme: json["theme"],
        signature: json["signature"],
        signatureFormat: json["signature_format"],
        created: json["created"],
        access: json["access"],
        login: json["login"],
        status: json["status"],
        timezone: json["timezone"],
        language: json["language"],
        picture: json["picture"],
        data: Data.fromJson(json["data"]),
        uuid: json["uuid"],
        roles: new Map.from(json["roles"]).map((k, v) => new MapEntry<String, String>(k, v)),
        rdfMapping: RdfMapping.fromJson(json["rdf_mapping"]),
    );

    Map<String, dynamic> toJson() => {
        "uid": uid,
        "name": name,
        "mail": mail,
        "theme": theme,
        "signature": signature,
        "signature_format": signatureFormat,
        "created": created,
        "access": access,
        "login": login,
        "status": status,
        "timezone": timezone,
        "language": language,
        "picture": picture,
        "data": data.toJson(),
        "uuid": uuid,
        "roles": new Map.from(roles).map((k, v) => new MapEntry<String, dynamic>(k, v)),
        "rdf_mapping": rdfMapping.toJson(),
    };
}

class Data {
    int mimemailTextonly;

    Data({
        this.mimemailTextonly,
    });

    factory Data.fromJson(Map<String, dynamic> json) => new Data(
        mimemailTextonly: json["mimemail_textonly"],
    );

    Map<String, dynamic> toJson() => {
        "mimemail_textonly": mimemailTextonly,
    };
}

class RdfMapping {
    List<String> rdftype;
    Name name;
    Homepage homepage;

    RdfMapping({
        this.rdftype,
        this.name,
        this.homepage,
    });

    factory RdfMapping.fromJson(Map<String, dynamic> json) => new RdfMapping(
        rdftype: new List<String>.from(json["rdftype"].map((x) => x)),
        name: Name.fromJson(json["name"]),
        homepage: Homepage.fromJson(json["homepage"]),
    );

    Map<String, dynamic> toJson() => {
        "rdftype": new List<dynamic>.from(rdftype.map((x) => x)),
        "name": name.toJson(),
        "homepage": homepage.toJson(),
    };
}

class Homepage {
    List<String> predicates;
    String type;

    Homepage({
        this.predicates,
        this.type,
    });

    factory Homepage.fromJson(Map<String, dynamic> json) => new Homepage(
        predicates: new List<String>.from(json["predicates"].map((x) => x)),
        type: json["type"],
    );

    Map<String, dynamic> toJson() => {
        "predicates": new List<dynamic>.from(predicates.map((x) => x)),
        "type": type,
    };
}

class Name {
    List<String> predicates;

    Name({
        this.predicates,
    });

    factory Name.fromJson(Map<String, dynamic> json) => new Name(
        predicates: new List<String>.from(json["predicates"].map((x) => x)),
    );

    Map<String, dynamic> toJson() => {
        "predicates": new List<dynamic>.from(predicates.map((x) => x)),
    };
}
2在需要访问这些字段的任何地方导入此库

import 'globals.dart' as globals;
...
globals.payload = payloadFromJson(jsonString); //from your parse or http logical
3在你的抽屉课上

import 'globals.dart' as globals;
... 
return Drawer(
  child: Column(
    children: <Widget>[
      UserAccountsDrawerHeader(
        accountName: Text("${globals.payload.user.name}"),
        accountEmail: Text("${globals.payload.user.mail}"), 
然后在LoginPage.dart中执行同样的操作,就可以

 globals.payload = payloadFromJson(jsonString);

理论上,您将需要一个具有类似结构的对象。但是,如果JSON很复杂,并且您需要一个/两个属性,那么下面可以是快速的方法

_emailId = decodedBody["user"]["mail"]
现在,假设您在登录页面中得到JSON响应,并且需要将_emailId传递到主页。您可以按如下方式执行此操作:

首页.dart

class HomePage extends StatelessWidget {
  final String emailId;

  const HomePage({
    Key key,
    @required this.emailId,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print (this.emailid);
    return .....
    );
  }
}
更新_sendToRegisterPage(),如下所示:

_sendToRegisterPage() {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => HomeScreen(emailId:_emailId)),
    );
  }

您的意思是在登录成功后,您想解析从Dio返回的json吗?你能发布你得到的json格式吗?请检查我附带的json文件@chunhunghan。你的问题有点让人困惑。您的意思是,如何解析JSON以提取电子邮件和用户名字段?或者,你是在正确地解析它,而在抽屉中显示它时遇到了麻烦?您面临的错误是什么?如何解析JSON以提取电子邮件和用户名字段。@Sukhi您是否可以将此JSON粘贴为文本而不是图像以允许我复制并提供结构?解析已完成,但如何在主页抽屉的UserAccountsHeader中显示它。有一些选项。Dart支持全局变量,您可以检查此项或使用此软件包,这是一个巨大的主题,我建议您发布另一个问题以获得更好的答案我的公司防火墙阻止我。你能查一下stackoverflow.com/questions/29182581/global-variables-in-dart吗?将数据保存为全局变量,您可以在任何地方使用它。不是一个好的选择,但工作。请您添加代码或编辑答案的过程。请修改打字错误。请检查。我已经在主页上更新了我的问题。请帮助我实现您解释的方法。同时查看我在登录页面中的实现是否正确。请参阅第页。这里有一个简单的例子说明如何做。或者,您必须实现类UserAccountsDrawerHeader(),它只不过是一个带有渐变(或图像)和文本覆盖(用户名、电子邮件id)的矩形。以最简单的形式,保存两个文本小部件的列小部件。我要问的问题是,我在loginpage中得到响应,通过获取该响应,我应该在主页中实现该响应,以获取用户名和邮件。我已经阅读了他们在虚拟模块中解释的内容,但我的情况不一样。我问题的主要问题是倾听响应并在主页上显示我应该在哪里写代码“_emailId=decodedBody[“user”][“mail”]”
 globals.payload = payloadFromJson(jsonString);
_emailId = decodedBody["user"]["mail"]
class HomePage extends StatelessWidget {
  final String emailId;

  const HomePage({
    Key key,
    @required this.emailId,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print (this.emailid);
    return .....
    );
  }
}
_sendToRegisterPage() {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => HomeScreen(emailId:_emailId)),
    );
  }