'Why is my updated data not reflecting on my flutter UI except i hot restart my app while using GetX state management?

I am using getx as my statemanagment for my flutter app. After updating a field from my update profile page, i am fetching the records and displaying it, but it's does not reflect on my UI unless I use the hot restart to restart the app.

I am using getx as my statemanagment for my flutter app. After updating a field from my update profile page, i am fetching the records and displaying it, but it's does not reflect on my UI unless I use the hot restart to restart the app.

Model

part 'user.g.dart';

@JsonSerializable()
class User {
  String? id;
  String? fullName;
  String? phoneNumber;
  String? password;
  String? profileImg;

  User(
      {this.id,
      this.fullName,
      this.phoneNumber,
      this.password,
      this.profileImg});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

Controller

class UserController extends GetxController {
  final networkHandler = NetworkHandler().obs;
  var circular = true.obs;
  var checkImg = false.obs;
  var isLoading = false.obs;
  var userModel = User().obs;

  @override
  void onInit() {
    fetchData();
  }

  void fetchData() async {
    try {
      isLoading(true);
      var response = await networkHandler.value.get("getProfileData");
      userModel.value = User.fromJson(response["data"]);
      circular(false);

      if (userModel.value.profileImg == '') {
        checkImg(true);
      }
    } catch (ex) {
      print({ex, 'An error occured while fetching user data'});
    } finally {
      isLoading(false);
    }
  }
}

NetworkHandler Class

class NetworkHandler{

//get method
  Future get(String url) async {
    String? token = await storage.read(key: "token");
    url = formater(url);
    var response = await http.get(
      Uri.parse(url),
      headers: {"Authorization": "Bearer $token"},
    );
    if (response.statusCode == 200 || response.statusCode == 201) {
      log.i(response.body);

      return json.decode(response.body);
    }
    log.i(response.body);
    log.i(response.statusCode);
  }

}

View

import 'package:flutter/material.dart';
import 'package:customer/src/controllers/UserController.dart';
import 'package:customer/src/views/widgets/home/grid_content.dart';
import 'package:customer/src/views/widgets/home/icon_badge.dart';

import 'package:get/get.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final userController = Get.put(UserController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 2.0,
        backgroundColor: Colors.white,
        actions: <Widget>[
            Obx(() {
            if (userController.isLoading.value) {
              return Center(child: CircularProgressIndicator());
            } else {
              return Container(
                child: Text(
                  userController.userModel.value.fullName!,
                  style: TextStyle(color: Colors.pinkAccent),
                ),
                child: CircleAvatar(
                  backgroundColor: Colors.grey,
                  radius: 20.0,
                  backgroundImage: userController.checkImg.value
                      ? AssetImage('assets/images/user.png')
                      : NetworkHandler().getImage(
                              userController.userModel.value.profileImg!)
                          as ImageProvider,
                ),
              );
            }
          }),
          SizedBox(
            width: 300.0,
          ),
          IconButton(
            icon: IconBadge(
              icon: Icons.notifications_none,
              color: Colors.black54,
              size: 30,
            ),
            onPressed: () {},
          )
        ],
      ),
      body: SingleChildScrollView(
        child: Material(
          color: Colors.grey[300],
          child: Column(
            children: [
              GridContent(),
            ],
          ),
        ),
      ),
    );
  }

}


Solution 1:[1]

If you have a list in viewModel and want to update that list, just use the list.refresh() when the list updated

RxList<Models> myList = <Models>[].obs;

when add or insert data act like this:

myList.add(newItem);
myList.refresh();

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 4xMafole