问题描述
对于显示类别下拉列表中的列表我正在使用Cubit,它的工作原理。我的问题:可以使用Cubit来显示selectedCategory吗?不使用setState吗?现在,当选择类别它不告诉我selectedCategory。 肘:
class CategoriesCubit extends Cubit<Categoriesstate> {
final DataBase dataBase;
final Category category;
CategoriesCubit(this.dataBase,this.category)
: super(CategoriesInitial());
StreamSubscription streamSubscription;
Future getCategories() async {
streamSubscription = dataBase.getCategories().listen((data) {
emit(CategoriesLoaded(data));
});
}
void setCategory(String selectedCategory) {
category.categoryID = selectedCategory;
}
}
主要:
class Main extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => CategoriesCubit(DataBase(),Category()),child: DropDownButton(),);
}
}
class DropDownButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
context.bloc<CategoriesCubit>().getCategories();
final category = context.bloc<CategoriesCubit>().category;
return Container(
child: BlocBuilder<CategoriesCubit,Categoriesstate>(
builder: (context,state) {
if (state is CategoriesLoaded) {
return DropdownButton(
value: category.categoryID,hint: Text('choose category'),items: state.categories
.map((category) => DropdownMenuItem(
child: Text(category.categoryName),value: category.categoryID,))
.toList(),onChanged: (selectedCategory) {
context.bloc<CategoriesCubit>().setCategory(selectedCategory);
print(selectedCategory);
},);
}
},),);
}
}
解决方法
您当前Cubit
的实现存在一些问题。
-
Cubit
应该是不可变的。您不应该使用category
变量将状态保留在其中正在使用的变量中。 - 您正在检索
BlocBuilder
之外的当前选定类别,并且Cubit
的状态更改时不会更新。 - 呼叫
setCategory
时,Cubit
的状态保持不变,因为您没有发出任何东西。 - 您的
CategoriesCubit
的任务是控制类别的获取状态。最好不要添加其他任务。
我建议将selectedCategoryId
保留为窗口小部件的内部状态,除非您需要在多个窗口小部件之间共享它或将其保留在它的祖先中。