4

我有这个无国籍的出生日期输入类,只读的。点击时,它会显示一个日期选择器,在用户选择一个日期后,它会将值发送到 bloc 状态,它会更改状态和值,以便显示从日期选择器中选择的日期。这是代码:

class DateOfBirthInput extends StatelessWidget {
  DateOfBirthInput({
    required this.textEditingController,
    required this.focusNode
  });

  final TextEditingController textEditingController;
  final FocusNode focusNode;

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<SignUpBloc, SignUpState>(
      buildWhen: (previous, current) => previous.dateOfBirth != current.dateOfBirth,
      builder: (context, state) {
        return Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Date of Birth',
              style: TextStyle(
                color: Colors.grey[500],
                fontWeight: FontWeight.w600
              )
            ),
            TextFormField(
              enabled: state.formEnabled,
              controller: textEditingController,
              focusNode: focusNode,
              readOnly: true,
              decoration: InputDecoration(
                hintText: '1 January 1990',
                hintStyle: TextStyle(
                  color: Colors.grey[400],
                  fontWeight: FontWeight.w500
                ),
                suffixIcon: Icon(
                  Icons.calendar_today_outlined,
                  size: 24.0,
                  color: Colors.grey[500],
                ),
                errorText: state.dateOfBirthDisplay.invalid ? 'Please enter your date of birth' : null,
                errorStyle: TextStyle(
                  fontSize: 14.0,
                  color: Colors.red,
                  fontWeight: FontWeight.w500
                ),
              ),
              onTap: () async {
                DateTime? datePicker = await showDatePicker(
                  context: context,
                  initialDate: DateTime.now(),
                  firstDate: DateTime(1900, 1),
                  lastDate: DateTime.now()
                );
                if (datePicker != null) {
                  String dateOfBirth = DateFormat('dd MMMM yyyy').format(DateTime.parse(datePicker.toString()));
                  textEditingController.text = dateOfBirth;
                  context.read<SignUpBloc>.add(DateOfBirthChanged(dateOfBirthDisplay: dateOfBirth, dateOfBirth: datePicker));
                }
              }
            ),
          ],
        );
      },
    );
  }
}

在这种情况下,我得到了一个错误。这是上下文:

context.read<SignUpBloc>.add(DateOfBirthChanged(dateOfBirthDisplay: dateOfBirth, dateOfBirth: datePicker));

这是错误:

此处不能使用前缀“上下文”,因为它被本地声明所遮蔽。尝试重命名前缀或本地声明。

我尝试更改其中一个上下文,builder: (context, state), 我已更改为builder: (ctx, state),但仍然出现相同的错误。

请帮忙。

4

2 回答 2

1

目前,您正在尝试从注册块的构建器上下文访问 SignupBloc,该context变量是因为您的无状态小部件的上下文和 blocbuilder 的上下文都被命名为context

将您的一个上下文重命名为其他内容,build(BuildContext context)或者builder: (context, state) {

您可以重命名builder: (ctx, state),然后错误应该消失了。

于 2021-04-28T07:39:02.467 回答
0

试试这个改变。

builder: (ctx, state) {
  //...
  ctx.read<SignUpBloc>.add(DateOfBirthChanged(dateOfBirthDisplay: dateOfBirth, dateOfBirth: datePicker));
},
于 2021-04-28T07:39:26.963 回答