Я хочу показать количество уведомлений из данных json моего ответа на вход из API входа в мое приложение flutter

#api #flutter #http #authentication

#API #flutter #http #аутентификация

Вопрос:

Я успешно вошел в систему из api входа, затем я получил ответ json отсюда. из ответа я могу извлечь некоторые данные. но я не могу получить массив уведомлений и мне нужно подсчитать массив уведомлений для моего количества значков уведомлений. Как я могу это сделать? пожалуйста, помогите. Формат 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",
            "type": "App\Notifications\HandSlipStatusNotification",
            "notifiable_id": 1,
            "notifiable_type": "App\User",
            "data": {
                "payment_id": 471,
                "generate_payment_id": "10200471",
                "message": "Hand Slip Disbursed.",
                "amount": 850
            },
            "read_at": null,
            "created_at": "2020-10-12 15:50:25",
            "updated_at": "2020-10-12 15:50:25"
        },
  

я могу показать идентификатор, имя, адрес электронной почты и т. Д., Но не могу получить доступ к 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, 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.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 = "my Url";




    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,
                  width: MediaQuery.of(context).size.width,
                  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.username, 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"]),

        );
      }),
),

          ],
        ),
      ),
    );
  }
}
  

Комментарии:

1. можете ли вы также опубликовать свой код? чтобы мы могли помочь вам решить любую вашу проблему.

2. Спасибо за твой ответ, брат. Я отредактировал свои вопросы с помощью своего кода. Пожалуйста, взгляните и помогите мне своими знаниями. заранее спасибо.

3. notificatiion = JsonResponse[‘unread_notifications’]; это не строка. это список.

4. Пожалуйста, проверьте homepage.dart. Я отредактировал строковое уведомление в List<dynamic> теперь я могу извлекать данные id, type, notifiable_id, но не могу получить доступ к следующим массивам «данных». Как я могу это решить? пожалуйста, помогите мне.