我需要在几页中保存变量。 我为此创建了
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
应该如何使用。
所以我的问题是我应该创建状态,我认为我在这里不需要它,或者我应该在我的情况下使用其他解决方案,或者也许我的解决方案根本没有错误?
我希望有人能向我解释正确的方法,因为即使这可行,我也真的很担心,但我不想以错误的方式编码。
如果您在页面上的某个位置使用
context.watch<ParametersCubit>()
,则这意味着该页面上的 UI 应根据此值的更改而更改,并且您的页面取决于此值。在这种情况下,您使用的是 cubit/bloc
。
但是,如果您不需要监听组装模型变量的变化并相应地更改 UI 的状态,那么使用
cubit/block
可能是多余的。在这种情况下,作为一个选项,您可以将此数据(模型)保存在存储库中,您可以在每个页面上访问该存储库。