我可以使用仅具有一种状态且不发出新状态的 BloC 吗?

问题描述 投票:0回答:1

我需要在几页中保存变量。 我为此创建了

Cubit
类,但在我看来,我不需要任何状态,因为我的小部件不依赖于任何东西。 我只需要跨页面保存数据以便最终使用它。

主页 -> A 页 -> B 页 -> C 页 -> D 页 -> 摘要

用户在页面中选择一些数据,我需要存储它,如果用户要后退和前进更改并将其发送到摘要中的 API,则保留选择的信息。

它的外观如下:

class ParametersCubit extends Cubit<ParametersState> {
  ParametersCubit() : super(ParametersStateInitial());

  BoxParams? boxParams;
  bool? privateRentier;

  Map<dynamic, int> mapOfSelectedIds = {};
  Map<dynamic, BoxSize?> mapOfSizes = {};
  Map<dynamic, Variants> mapOfVariants = {};

  DateTime selectedDate = DateTime.now();
  DateTime? selectedRangeDate = DateTime.now().add(Duration(days: 14));

  void initParameters(BoxParams selectedBox, bool? privRentier) {
    clearParameters();
    boxParams = selectedBox;
    privateRentier = privRentier;
  }

  void setMapParameters(Map<dynamic, int> ids, Map<dynamic, BoxSize?> sizes, Map<dynamic, Variants> variants) {
    mapOfSelectedIds = ids;
    mapOfSizes = sizes;
    mapOfVariants = variants;
  }

  void clearParameters() {
    boxParams = null;
    privateRentier = null;
    mapOfSizes = {};
    mapOfSelectedIds = {};
    mapOfVariants = {};
    selectedDate = DateTime.now();
    selectedRangeDate = DateTime.now().add(Duration(days: 14));
  }

  void rentBox() {
    //TODO send request to API
  }
}

这是我的状态课程:

abstract class ParametersState {}

class ParametersStateInitial extends ParametersState {}

但我实际上没有使用任何状态。

以下是我在代码中访问此参数的方法:


class SelectDate extends StatefulWidget {
  const SelectDate({Key? key}) : super(key: key);

  @override
  State<SelectDate> createState() => _SelectDateState();
}

class _SelectDateState extends State<SelectDate> {


  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    final local = AppLocalizations.of(context)!;
    return Scaffold(
      body: SafeArea(
        child: MainPadding(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                'From when you want to rent?',
                style: TextStyle(
                    fontSize: 20,
                    fontWeight: FontWeight.w600,
                    color: Color(0xFF1B1B1B)
                ),
              ),
              const SizedBox(height: 64),
              CalendarDatePicker2(
                config: CalendarDatePicker2Config(
                  calendarType: CalendarDatePicker2Type.single,
                  firstDayOfWeek: 1,
                  firstDate: DateTime.now(),
                  weekdayLabels: [
                    local.sunday,
                    local.monday,
                    local.tuesday,
                    local.wednesday,
                    local.thursday,
                    local.friday,
                    local.saturday,
                  ]
                ),
                value: [
                  context.watch<ParametersCubit>().selectedDate
                ],
                onValueChanged: (date) {
                  context.read<ParametersCubit>().selectedDate = date.single;
                },
              )
            ]
          ),
        ),
      ),
    );
  }
}

我还有几页,使用这个

Cubit
类和
context.read()
来访问变量并设置它们。

它实际上按预期工作,但我想这不是

Cubit
Bloc
应该如何使用。

所以我的问题是我应该创建状态,我认为我在这里不需要它,或者我应该在我的情况下使用其他解决方案,或者也许我的解决方案根本没有错误?

我希望有人能向我解释正确的方法,因为即使这可行,我也真的很担心,但我不想以错误的方式编码。

flutter flutter-bloc
1个回答
0
投票

如果您在页面上的某个位置使用

context.watch<ParametersCubit>()
,则这意味着该页面上的 UI 应根据此值的更改而更改,并且您的页面取决于此值。在这种情况下,您使用的是
cubit/bloc

但是,如果您不需要监听组装模型变量的变化并相应地更改 UI 的状态,那么使用

cubit/block
可能是多余的。在这种情况下,作为一个选项,您可以将此数据(模型)保存在存储库中,您可以在每个页面上访问该存储库。

© www.soinside.com 2019 - 2024. All rights reserved.