List Cubit Flutter中的UpdateValue

Posted

技术标签:

【中文标题】List Cubit Flutter中的UpdateValue【英文标题】:UpdateValue in List Cubit Flutter 【发布时间】:2021-01-09 19:31:07 【问题描述】:

在应用程序中,我使用的是 Cubit。从 Firestore 获取 ItemData。一切正常,但是在列表中添加项目并在firestore中更新值(名称)之后,列表中仍然是旧值。如何解决?

 class TestPage extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Column(
        children: [
          BlocBuilder<ItemCubit, ItemState>(
            cubit: ItemCubit(DataBase())..getItemData(item),
            builder: (context, state) 
              if (state is ItemData) 
                return Column(
                  children: [
                    Text(state.item.name),
                    RaisedButton(
                      onPressed: () 
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => TestPage1(
                                      item: state.item,
                                    )));
                      ,
                      child: Text('showPage'),
                    ),
                    RaisedButton(
                      onPressed: () 
                        context.bloc<TestCubit>().add(item);
                      ,
                    )
                  ],
                );
              
              return Container(
                child: Text('error'),
              );
            ,
          )
        ],
      ),
    );
  

为了在列表中添加项目,我正在使用另一肘 代码:

class AddCubit extends Cubit<AddState> 
  AddCubit() : super(AddInitial());
  List<Item> items = List<Item>();

  void addItem(Item item) 
    items.add(item);
    emit(LoadList(items));
  

这是用于检索 TestPage1 中的项目列表的块:

  BlocBuilder<AddCubit, AddState>(builder: (context, state) 
          if (state is LoadList) 
            return Column(
              children: state.items.toSet().map((item) 
                return Card(
                  child: Text(item.name),
                );
              ).toList(),
            );
          
        )

状态码:

class LoadList extends AddState 
  final List<Item> items;

  LoadList(this.items);

【问题讨论】:

【参考方案1】:

在 Flutter 中,当您比较同一类的两个对象时,即使它们的值不同,您也将始终相等。除非你会在课堂上使用相等方法。

具有相等方法的类代码

import 'package:equatable/equatable.dart';

class LoadList extends AddState 
  final List<Item> items;

  LoadList(this.items);
  @override
  List<Object> get props => [items];

第二件事是你应该使用副本而不是为新值创建新状态。它稍后会派上用场,并减少以后可能出现的错误数量。

状态类的完整代码

import 'package:equatable/equatable.dart';

class LoadList extends AddState 
  final List<Item> items;
  LoadList(this.items);

  LoadList copyWith(
    List<Item> items,
  ) 
    return LoadList(
      items: items?? this.items,
    );
  

  @override
  List<Object> get props => [items];

然后你应该使用 void 函数:

void addItem(Item item) 
    items.add(item);
    emit(state.copyWith(items: items);
 

【讨论】:

以上是关于List Cubit Flutter中的UpdateValue的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - cubit - 改变cubit内的布尔值

Flutter - 使用国际翻译对 Cubit/ Bloc 内的消息进行应用本地化

Flutter - Cubit 和一些需要澄清

Flutter cubit blocprovider 找不到正确的提供者

Flutter:单元测试一个 Cubit 问题

在 Flutter 中使用 Bloc/Cubit 时绕过 CONTEXT