对于下拉按钮中的显示categoryList,我正在使用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
保留为窗口小部件的内部状态,除非您需要在多个窗口小部件之间共享它或将其保留在It's祖先中。