我正在使用 Getx 进行状态管理,当我将数据添加到服务器时,它不会在列表视图中出现更新的数据,直到热重启而列表视图位于 Obx 中

Posted

技术标签:

【中文标题】我正在使用 Getx 进行状态管理,当我将数据添加到服务器时,它不会在列表视图中出现更新的数据,直到热重启而列表视图位于 Obx 中【英文标题】:I am using Getx for statemanagement, when I add data to server it doesn't appear newer data in listview until hot restart while list view is in Obx 【发布时间】:2021-05-14 05:31:09 【问题描述】:

我正在开发一个应用程序。从服务器获取数据的其余 API 可以正常工作。但是当我尝试向服务器添加数据时,列表中不会出现更新的数据。这是我的视图和控制器类代码。

查看课程代码。它在无状态小部件中

Expanded(
            child: Obx(() 
              if (controller.isLoading.value) 
                return Center(child: LoadingBar());
               else 
                return controller.profilesList.length == 0
                    ? Center(child: Text("No Service Found"))
                    : ListView.builder(
                        physics: ScrollPhysics(),
                        shrinkWrap: true,
                        itemCount: controller.profilesList.length,
                        itemBuilder: (context, index) 
                          return Card(
                            elevation: 5,
                            shape: RoundedRectangleBorder(
                                borderRadius:
                                    BorderRadius.all(Radius.circular(5))),
                            clipBehavior: Clip.antiAlias,
                            child: Container(
                              height: 100,
                              child: Row(
                                children: [
                                  Padding(
                                    padding: const EdgeInsets.all(2.0),
                                    child: Container(
                                        width: 100,
                                        // height: 100,
                                        decoration: BoxDecoration(
                                            borderRadius: BorderRadius.all(
                                                Radius.circular(5)),
                                            image: DecorationImage(
                                                image: NetworkImage(
                                                    'http://192.168.43.113:4000/$controller.profilesList[index].shopImage'),
                                                fit: BoxFit.cover))),
                                  ),
                                  Flexible(
                                    child: Padding(
                                      padding: const EdgeInsets.all(2.0),
                                      child: Column(
                                        crossAxisAlignment:
                                            CrossAxisAlignment.start,
                                        mainAxisAlignment:
                                            MainAxisAlignment.spaceBetween,
                                        children: [
                                          Text(
                                            controller
                                                .profilesList[index].shopName,
                                            style: TextStyle(
                                                color: Colors.black,
                                                fontWeight: FontWeight.bold,
                                                fontSize: 15),
                                          ),
                                          Text(
                                              controller
                                                  .profilesList[index].address,
                                              maxLines: 1,
                                              overflow: TextOverflow.ellipsis,
                                              style: TextStyle(
                                                  color: Colors.black54)),
                                          Text('9:AM-10:PM Mon-Sat',
                                              maxLines: 1,
                                              overflow: TextOverflow.ellipsis,
                                              style: OrdersTextStyle
                                                  .servicesTextStyle()),
                                          Align(
                                            alignment: Alignment.bottomLeft,
                                            child: Container(
                                              decoration: BoxDecoration(
                                                color: CustomColors.lightRed,
                                                //   border: Border.all(width: 1),
                                                borderRadius: BorderRadius.all(
                                                    Radius.circular(5)),
                                              ),
                                              child: Padding(
                                                padding:
                                                    const EdgeInsets.all(3.0),
                                                child: Text(
                                                  controller
                                                      .profilesList[index]
                                                      .providercategories
                                                      .providerCatName,
                                                  style: TextStyle(
                                                      color: Colors.white,
                                                      fontWeight:
                                                          FontWeight.normal),
                                                ),
                                              ),
                                              // height: 25,
                                              // width: 70,
                                            ),
                                          )
                                        ],
                                      ),
                                    ),
                                  )
                                ],
                              ),
                            ),
                          );
                        ,
                      );
              
            ),

这是我的控制器类

class ProviderProfilesController extends GetxController 
  var id = ''.obs;
  var isLoading = true.obs;
  var profilesList = <ProfileModel>[].obs;
  

  void getProfilesData(String id) async 
    isLoading(true);
    try 
      var list = await ApiServices.getProvidersprofileData(id);
      if (list != null) 
        profilesList.value = list;
       
      
     finally 
      isLoading(false);
      
    
//profilesList.refresh();
    
  
  @override
  void onInit() 
    super.onInit(); 
    getProfilesData(id.value);

  

【问题讨论】:

【参考方案1】:

我认为这里的问题是您正在使用 profileList.value 来更新列表,而正确的方法是使用 List 的函数将项目添加到列表中,如下例所示:

final abc = [0,1,2].obs;

abc.add(12);

在您的情况下,一旦您想添加整个列表,您可以使用以下代码:

abc.addAll(['12','234','1465']);

如果这不起作用,请告诉我,因为 getx 上还有更新和刷新功能,有时可以解决我的问题。我会尽快在这里回复。

【讨论】:

问题是通过使用 FutureBuilder 而不是 obx 解决的

以上是关于我正在使用 Getx 进行状态管理,当我将数据添加到服务器时,它不会在列表视图中出现更新的数据,直到热重启而列表视图位于 Obx 中的主要内容,如果未能解决你的问题,请参考以下文章

我正在将我的颤振应用程序的状态管理更改为 getx,我遇到了在下拉选择后更改应用程序状态的问题

Flutter GetX 状态管理不起作用

Flutter GetX 状态管理按钮单击

Flutter状态管理--GetX的简单使用

Flutter状态管理--GetX的简单使用

Flutter状态管理--GetX的简单使用