How to update a map with map data from API in Flutter

Viewed 98

I am new to Flutter and finding it difficult to update _users with a map I get from API. I get build errors even though no actual errors are shown in VSCode.

Here is my code.

import 'dart:convert';

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

class Users with ChangeNotifier {
  final String id;
  final String firstName;
  final String lastName;
  final String emailAddress;
  final String phoneNumber;
  final String classId;
  final String roleId;
  final String dateCreated;
  final String uid;
  bool isActive;
  final String profilePhoto;

  Users({
    required this.id,
    required this.firstName,
    required this.lastName,
    required this.emailAddress,
    required this.phoneNumber,
    required this.classId,
    required this.roleId,
    required this.dateCreated,
    required this.uid,
    required this.isActive,
    required this.profilePhoto,
  });

  Map<String, Users> _users = {};

  Map<String, Users> get users {
    return {..._users};
  }

  Future<void> fetchUser() async {
    try {
      final String idToken =
          await FirebaseAuth.instance.currentUser!.getIdToken();

      final reauthUrl = Uri.parse(
          'https://example-backend.azurewebsites.net/api/v1/User/reauth');

      final reauthResponse = await http.post(reauthUrl,
          headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
          },
          body: json.encode({"token": idToken}));

      final returnedTokenData =
          json.decode(reauthResponse.body) as Map<String, dynamic>;

      final serverToken = returnedTokenData['token'];

      final url =
          Uri.parse('https://example-backend.azurewebsites.net/api/v1/User');

      final response = await http.get(
        url,
        headers: {'Authorization': 'Bearer $serverToken'},
      );

      final responseData = json.decode(response.body) as Map<String, dynamic>;
      Map<String, dynamic> userData = {};
      userData.update(id, (value) {
        return Users(
          id: responseData['id'],
          firstName: responseData['firstName'],
          lastName: responseData['lastName'],
          emailAddress: responseData['emailAddress'],
          phoneNumber: responseData['phoneNumber'],
          classId: responseData['classId'],
          roleId: responseData['roleId'],
          dateCreated: responseData['dateCreated'],
          uid: responseData['uid'],
          isActive: responseData['isActive'],
          profilePhoto: responseData['profilePhoto'],
        );
      });
      print(userData);

      notifyListeners();
    } catch (error) {
      rethrow;
    }
  }
}
1 Answers

One way to fix the issue is to not use maps and assign the values from the API directly to the variables in your class. The variables should not be final to be able to reassign values to them.

final responseData = json.decode(response.body) as Map<String, dynamic>;
id = responseData['id'];
      firstName = responseData['firstName'];
      lastName = responseData['lastName'];
      emailAddress = responseData['emailAddress'];
      phoneNumber = responseData['phoneNumber'];
      classId = responseData['classId'];
      roleId = responseData['roleId'];
      dateCreated = responseData['dateCreated'];
      uid = responseData['uid'];
      isActive = responseData['isActive'];
      profilePhoto = responseData['profilePhoto'];
Related