需要将我的登录api json响应保存在SharedPreferences中

问题描述

我已经从登录Api登录。然后我得到了json的响应数据。我需要将id,名称和api_token保存在sharedpreferences中。我该怎么做。我已经显示了所有代码。请帮忙。 响应json格式为-

{
    "id": 1,"name": "Mr Admin","email": "admin2@gmail.com","username": "admin2","api_token": "oYfajebhRzlxpMZV8dHI6w5R8CrpgybaGqX2ZaIXkGpumE9hZSgLVVINAgaF","user_types_id": null,"created_at": "2020-01-21 16:21:48","updated_at": "2020-10-14 11:31:10","deleted_at": null,"unread_notifications": [
        {
            "id": "d54ee0cc-054a-4d51-a53b-5f6f658841ae","type": "App\\Notifications\\HandSlipStatusNotification","notifiable_id": 1,"notifiable_type": "App\\User","data": {
                "payment_id": 471,"generate_payment_id": "10200471","message": "Hand Slip Settled.","amount": 850
            },"read_at": null,"created_at": "2020-10-12 15:50:38","updated_at": "2020-10-12 15:50:38"
        },{
            "id": "aedb7880-4201-4805-b017-62242dfed741","message": "Hand Slip disbursed.","created_at": "2020-10-12 15:50:25","updated_at": "2020-10-12 15:50:25"
        },

我可以显示id,name,email等,但是无法访问unread_notifications。 我的代码- api_service.dart->

 class LoginResponseModel {
  final String token;
  final String error;
  LoginResponseModel({this.token,this.error});
  factory LoginResponseModel.fromJson(Map<String,dynamic> json) {
    return LoginResponseModel(
      token: json["token"] != null ? json["token"] : "",error: json["error"] != null ? json["error"] : "",);
  }
}
class LoginRequestModel {
  String email;
  String password;
  String username;

  LoginRequestModel({
    this.email,this.password,this.username,});

  Map<String,dynamic> toJson() {
    Map<String,dynamic> map = {
      // 'email': email.trim(),'username': username.trim(),'password': password.trim(),};

    return map;
  }
}

login_model

  class LoginResponseModel {
  final String token;
  final String error;

  LoginResponseModel({this.token,this.error});

  factory LoginResponseModel.fromJson(Map<String,);
  }
}

class LoginRequestModel {
  String email;
  String password;
  String username;

  LoginRequestModel({
    this.email,};

    return map;
  }
}

login.dart

import 'package:Flutter/material.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'homepage.dart';


class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  var allData ;

  TextEditingController _userController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();


  bool _isLoading = false;


  // arrange method for api log in

  signIn( String username,String password) async {
    // String url = "https://reqres.in/api/login";
    String url = "myurl";




    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    Map body = { "username": username,"password": password
    };
    var notificatiion;
    var jsonResponse;
    var res = await http.post(url,body: body);

    //need to check the api status

    if (res.statusCode == 200) {
      jsonResponse = json.decode(res.body);
      notificatiion = jsonResponse['unread_notifications'];
      print("Response status: ${res.statusCode}");
      print("Response status: ${res.body}");


      if (jsonResponse != null) {
        setState(() {
          _isLoading = false;
        });

        sharedPreferences.setString("token",jsonResponse['token']);
        Navigator.of(context).pushAndRemoveUntil(
            MaterialPageRoute(builder: (BuildContext) =>
                HomePage(
                email: jsonResponse['email'],name: jsonResponse['name'],username : jsonResponse['username'],notification: notificatiion,),(Route<dynamic> route) => false);
      }
    } else {
      setState(() {
        _isLoading == false;
      });
      print(" Response status : ${res.body}");


    }
  }




  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
      body:  SingleChildScrollView(
        child: Center(
          child: Container(
            padding: EdgeInsets.fromLTRB(20,100,20,20),child: Column(
              mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [

                Text("Login",style: TextStyle(fontSize: 32),SizedBox(
                  height: 30,Card(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(20),child: Container(
                    height: 220,width: MediaQuery.of(context).size.width,decoration: Boxdecoration(
                      borderRadius: BorderRadius.circular(20),child: Column(
                      children: [
                        Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _userController,decoration: Inputdecoration(hintText: "username"),Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _passwordController,obscureText: true,decoration: Inputdecoration(hintText: "Password"),],SizedBox(
                  height: 60,child: RaisedButton(
                    color: Colors.lightBlue,shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(16),child: Text("Sign In"),onpressed: _userController.text == ""||
                        _passwordController.text == ""
                        ? null
                        : () {
                      setState(() {
                        _isLoading = true ;

                      });
                      signIn(_userController.text,_passwordController.text);
                    },SizedBox(
                  height: 20,FlatButton(
                  child: Text("Forgot password"),onpressed: (){

          },);
  }
}

我想在主页上显示所有响应值。在通知的图标中,我想显示数组计数。 homepage.dart

import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';

import 'login.dart';
import 'login.dart';

class HomePage extends StatelessWidget {
  String email;
  String name;
  String username;
   List<dynamic> notification;

  HomePage({this.email,this.name,this.notification,});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Cash-Management"),backgroundColor: Colors.blue,actions: [
            IconButton(icon: Icon(Icons.notifications),onpressed: () {}),IconButton(
                icon: Icon(Icons.exit_to_app),onpressed: () {
                  Navigator.push(
                    context,MaterialPageRoute(builder: (context) => Login()),);
                }),body: ListView(
          children: <Widget>[
            Container(
              height: 200,child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
                  Text(
                    "  $email ",style: TextStyle(fontSize: 16),Text(" $name "),Text(" $username "),Container(
  height: 300,child:   ListView.builder(
      itemCount: notification == null ?  0 : notification.length,itemBuilder: (context,index){
        return ListTile(
          title: Text(notification[index] ["id"]),subtitle: Text(notification[index]["type"]),);
      }),);
  }
}

解决方法

请参考该模型以访问unread_notifications

Data itemModelFromJson(Map<String,dynamic> data) => Data.fromJson(data);

class Data {
  Data({
    this.items,});

  List<Item> items;

  factory Data.fromJson(Map<String,dynamic> json) => Data(
        items: List<Item>.from(json['unread_notifications'].map((x) => Item.fromJson(x))),);
}

class Item {
  Item({
    this.itemType,this.itemCreated,});

  String itemType;
  String itemCreated;

  factory Item.fromJson(Map<String,dynamic> json) => Item(
        itemType: json["type"],itemCreated: json["created_at"],);
}
,

您无需在此处使用模型,我对登录代码进行了一些更改,可以粘贴整个登录代码

创建一个文件SharedPrefrence.dart,然后在其中添加以下类,您可以添加更多功能

import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

class SharedPrefrence {
  Future<bool> setToken(String token) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString("token",token);
  }

  Future<String> getToken() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString("token") ?? '';
  }

  Future<bool> setUserId(String userId) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString("user_id",userId);
  }

  Future<String> getUserId() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString("user_id") ?? '';
  }

  Future<bool> setName(String name) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString("name",name);
  }

  Future<String> getName() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString("name") ?? '';
  }

  Future<bool> setLoggedIn(bool status) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setBool("logged_in",status);
  }

  Future<bool> getLogedIn() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getBool("logged_in") ?? false;
  }
}

Login.dart

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import 'SharedPrefrence.dart';

class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  bool isprocesscomplete = false;
  TextEditingController _userController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();
  final _scaffoldKey = GlobalKey<ScaffoldState>();
  String BaseUrl = "http://www.accounting.emicrodev.com/api/login";
 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,body: SingleChildScrollView(
        child: Center(
          child: Container(
            padding: EdgeInsets.fromLTRB(20,100,20,20),child: Column(
              mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
                Text(
                  "Login",style: TextStyle(fontSize: 32),),SizedBox(
                  height: 30,Card(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(20),child: Container(
                    height: 220,width: MediaQuery.of(context).size.width,decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(20),child: Column(
                      children: [
                        Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _userController,decoration: InputDecoration(hintText: "username"),Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _passwordController,obscureText: true,decoration: InputDecoration(hintText: "Password"),],SizedBox(
                  height: 60,child: RaisedButton(
                    color: Colors.lightBlue,onPressed: () {
                      if (_userController.text == "" ||
                          _passwordController.text == "") {
                        final snackBar = SnackBar(
                            content: Text("Enter Username and Password"));
                        _scaffoldKey.currentState.showSnackBar(snackBar);
                      } else {
                        signIn(_userController.text,_passwordController.text);
                      }
                    },child: ProgressButton(),shape: RoundedRectangleBorder(
                      borderRadius: new BorderRadius.circular(16),SizedBox(
                  height: 20,FlatButton(
                  child: Text("Forgot password"),onPressed: () {},);
  }

  Widget ProgressButton() {
    if (isprocesscomplete != false) {
      return CircularProgressIndicator(
          valueColor: AlwaysStoppedAnimation<Color>(Colors.white));
    } else {
      return new Text(
        "Sign In",style: const TextStyle(
          color: Colors.white,fontSize: 15.0,);
    }
  }

  void signIn(String username,String password) async {
    setState(() {
      isprocesscomplete = true;
    });
    var response = await http.post(BaseUrl,headers: {"Content-Type": "application/json"},body: json.encode({
          "username": username,"password": password,}));

    Map<String,dynamic> value = json.decode(response.body);
    // print('Respone ${response.body}');
    if (response.statusCode == 200) {
      try {
        ///You don't need it but it will be cool for show progress dialgo for 4 second then redirect even if we get reslut
        Future.delayed(Duration(seconds: 4),() {
          // 5s over make it false
          setState(() {
            isprocesscomplete = false;
          });
        });

        Map<String,dynamic> value = json.decode(response.body);
        print('Respone ${response.body}');
        SharedPrefrence().setToken(value['api_token'].toString());
        SharedPrefrence().setName(value['name']);
        SharedPrefrence().setUserId(value['id'].toString());

        ///This is used when user loged in you can set this true,///next time you open you need to check loginc in main.dart or splashscreen if this is true if it is true then
        ///redirect to home page it is false then redirect to Login page
        ///When you logout the app make sure you set this as false like "SharedPrefrence().setLoggedIn(false);"
        SharedPrefrence().setLoggedIn(true);

        ///Redirect to Home page
        // Navigator.pushAndRemoveUntil(
        //                         context,//                         MaterialPageRoute(
        //                             builder: (context) => HomePage()),//                         ModalRoute.withName("/login"));

      } catch (e) {
        e.toString();
        final snackBar =
            SnackBar(content: Text("something wrong,Try again ?"));
        _scaffoldKey.currentState.showSnackBar(snackBar);
      }
    } else {
      var message = value['error'];
      final snackBar = SnackBar(
          backgroundColor: Colors.redAccent[700],content: Text(message.toString()));
      _scaffoldKey.currentState.showSnackBar(snackBar);
    }
  }
}**

您可以像这样访问主页中的“保存的共享偏好”值

     String nametoprint;
      String tokentoprint;
        
          @override
          void initState() {
            super.initState();
            Future name = SharedPrefrence().getName();
            name.then((data) async {
              nametoprint = data;
              print(nametoprint);
            });

           Future token= SharedPrefrence().getToken();
            token.then((data) async {
              tokentoprint= data;
              print(tokentoprint);
            });
          }