对于下拉按钮中的显示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祖先中。

    10-05 21:39