gpt4 book ai didi

android - Flutter - BloC Cubit 函数不发射状态

转载 作者:行者123 更新时间:2023-12-05 08:36:08 25 4
gpt4 key购买 nike

我正在创建一个 Flutter 应用程序。我在我的项目中添加了一个 BloC 来管理状态。我创建了一个包含数据的列表。我想使用“添加”按钮手动将项目添加到 ListView。

我写了一段代码:

我的项目肘

class ItemCubit extends Cubit<List<Item>> {
ItemCubit() : super([]);

void addItem(item){
state.add(item);
emit(state);
}
}

提供者的项目页面:

class SearchPage extends StatelessWidget {
const SearchPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (_) => ItemCubit(),
child: Search(),
),
);
}
}

我在 Stateless Widget 中调用 BlocBuilder 是这样的:

body: BlocBuilder<MarketCubit, List<Market>>(
builder: (context, items) => TabBarView(...))

所以当我从状态调用我的函数时:

Item item = Item(1, 'Item 1');


ElevatedButton(onPressed:(){
context.read<ItemCubit>().addItem(item);
}, child: Text('Add Item')),

ListView 没有更新。什么问题?非常感谢!

最佳答案

问题是您只是将项目添加到状态并重新发出相同的(修改过的)列表。当你调用 emit() 时,Bloc 本质上会检查状态对象的值,看它是否是一个新对象,如果它是与上一个状态“相同的列表”,它什么都不做。这很令人困惑,因为即使您向列表中添加了一个新值,它在某种意义上仍然是同一个对象,只是具有一个新值。

因此,如果您只是创建一个新列表而不是修改原始列表并发出它,应该有一个简单的修复方法。

例如,这应该可以解决问题:

emit([...state, newValue])

final newList = List.from(state)..add(newValue);
emit(newList);

(我在 bloc 文档中找不到对此进行解释的地方,但有许多讨论它的问题线程 - https://github.com/felangel/bloc/issues/2374)

从本质上讲,状态应该是“不可变的”,所以如果您要发出一个新状态,您实际上应该为您要发出的任何东西创建一个新实例。我通常使用状态的方式是为 cubit 跟踪的任何状态创建一个带有最终字段的类,以及一个 copyWith 方法,该方法可以轻松创建具有任何修改字段的新实例:

YourCubitState{
final List stateList;
final otherField;

const YourCubitState({
this.stateList = [],
this.otherField,
});

YourCubitState copyWith({
List? stateList,
otherField,
}) =>
YourCubitState(
stateList: stateList ?? this.stateList,
otherField: otherField ?? this.otherField,
);

}

如果状态只是一个列表,这可能是不必要的,但如果您发现自己想要向状态添加属性,那么这是一个很好的模式。

关于android - Flutter - BloC Cubit 函数不发射状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70411724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com