#flutter #dart
Вопрос:
Я получаю эту ошибку:
Конечную переменную «hasFocus» можно задать только один раз. Попробуйте сделать «hasFocus» не окончательным.dartassignment_to_final_local
Я получаю сообщение об ошибке в этой строке здесь hasFocus = isFocused;
Приведенный ниже код hasFocus
не является окончательным, так в чем же ошибка?
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:reactive_forms/reactive_forms.dart'; import 'package:vepo/src/presentation/common/constants/length.dart'; import 'package:vepo/src/presentation/widgets/form_fields/date_time_range_field/date_time_range_picker_field.dart'; import 'package:vepo/src/presentation/widgets/form_fields/duration_field/duration_field_vm.dart'; import 'package:vepo/src/presentation/widgets/interactive_non_form_widgets/buttons/icon_buttons/icon_button/icon_button_widget.dart'; class VpDurationField extends ReactiveFormFieldlt;Duration, Durationgt; { VpDurationField( {required this.formControlName, required this.context, required this.hintText, this.labelText, this.textColor, this.hasFocus = false, this.textAlign = TextAlign.left, this.form, this.onSubmitted, this.key, this.textInputAction = TextInputAction.done, this.nextField, this.validationMessages, this.onFocusChange}) : super( key: key, formControlName: formControlName, validationMessages: validationMessages, showErrors: (control) =gt; control.invalid, builder: (ReactiveFormFieldStatelt;Duration, Durationgt; field) { final vm = context.read(durationFieldVmProvider); return Container( height: LENGTH_7, child: FocusScope( child: Focus( onFocusChange: (isFocused) { hasFocus = isFocused; if (onFocusChange != null) { onFocusChange(isFocused); } }, child: TextField( controller: vm.textEditingController, onTap: () =gt; vm.showDurationField(context), keyboardType: TextInputType.datetime, enableInteractiveSelection: false, focusNode: AlwaysDisabledFocusNode(), decoration: InputDecoration( hintText: hintText, errorMaxLines: 3, suffixIconConstraints: const BoxConstraints( minWidth: 2, minHeight: 2, ), suffixIcon: VpIconButton( icon: Icon( FontAwesomeIcons.calendarPlus, color: Theme.of(context).colorScheme.primary, )), alignLabelWithHint: true, labelStyle: TextStyle( height: 0, fontSize: 18.0, color: Theme.of(context).colorScheme.primaryVariant), labelText: labelText, counterText: ''), ), ))); }); final TextAlign textAlign; final String hintText; final String formControlName; final String? labelText; final void Function(bool)? onFocusChange; final void Function()? onSubmitted; final Color? textColor; final BuildContext context; bool hasFocus; Maplt;String, Stringgt; Function(AbstractControllt;Durationgt;)? validationMessages; /// This is only required when setting the next field to focus on. final FormGroup? form; Key? key; /// This is only required when setting the next field to focus on. final String? nextField; /// This is to be 'next' if not the last field, and 'done' when is the last field. final TextInputAction textInputAction; }
Комментарии:
1. Либо: A. Ваша IDE сбита с толку. Попробуйте перезапустить его. B. Ошибка не соответствует показанному вами коду.
2. @jamesdlin Ошибка произошла во время компиляции в моей среде IDE, поэтому она была для этого кода, так как в нем были красные закорючки. У него все еще были закорючки после перезапуска IDE (ПРОТИВ кода). У меня один и тот же код во всех виджетах пользовательских форм без проблем. Вздох. Я просто удалил члена
hasFocus
класса и в конце использовал локальную переменную. Я согласен, происходит что-то странное, поэтому переполнение стека не может помочь, но больше не может удалить.
Ответ №1:
на мой взгляд, лучше создать еще одну новую переменную и позволить этой новой переменной = hasFocus вместо использования hasFocus использовать новую переменную.
Ответ №2:
Попробуйте удалить
this.hasFocus = ложь
Комментарии:
1. Он избавился от ошибки, но имеет другую ошибку . «Элемент экземпляра» hasFocus » не может быть доступен в инициализаторе. Попробуйте заменить ссылку на элемент экземпляра другим выражением»
Ответ №3:
Я не получаю такой ошибки при попытке использовать аналогичный код. Может быть, попробуем
- Перезапуск среды IDE
- Проверьте, используете ли вы последнюю версию flutter amp; dart