Дарт считает, что переменная помечена как окончательная, когда это не так

#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:

Я не получаю такой ошибки при попытке использовать аналогичный код. Может быть, попробуем

  1. Перезапуск среды IDE
  2. Проверьте, используете ли вы последнюю версию flutter amp; dart