본문 바로가기

개발하자

_startDate로 인해 플러터에 지연 초기화 오류가 발생

반응형

_startDate로 인해 플러터에 지연 초기화 오류가 발생

포함된 스크린샷에서 볼 수 있듯이, 앱을 실행할 때 지연 초기화 오류가 발생합니다. 원인은 아래 코드에 있는데 어떻게 고칠지 모르겠어요. 그것은 확실히 제가 사용하고 있는 "lateDateTime_startDate;"와 관련이 있지만, 올바른 접근 방식이 무엇인지는 확실하지 않습니다. 당신은 알기라도 하나요? 미리 알아봐 주셔서 감사합니다!

class AddEventPage extends StatefulWidget {
  final DateTime? selectedDate;
  final AppEvent? event;

  const AddEventPage({Key? key, this.selectedDate, this.event})
      : super(key: key);
  @override
  _AddEventPageState createState() => _AddEventPageState();
}

late DateTime _startDate;
late TimeOfDay _startTime;
late DateTime _endDate;
late TimeOfDay _endTime;

class _AddEventPageState extends State<AddEventPage> {
  final _formKey = GlobalKey<FormBuilderState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
        leading: IconButton(
          icon: Icon(
            Icons.clear,
            color: AppColors.primaryColor,
          ),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
        actions: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: ElevatedButton(
              onPressed: () async {
                //save
                _formKey.currentState!.save();
                final data =
                    Map<String, dynamic>.from(_formKey.currentState!.value);
                data["Time Start"] =
                    (data["Time Start"] as DateTime).millisecondsSinceEpoch;
                if (widget.event != null) {
                  //update
                  await eventDBS.updateData(widget.event!.id!, data);
                } else {
                  //create
                  await eventDBS.create({
                    ...data,
                    "user_id": context.read(userRepoProvider).user!.id,
                  });
                }
                Navigator.pop(context);
              },
              child: Text("Save"),
            ),
          )
        ],
      ),
      body: ListView(
        padding: const EdgeInsets.all(16.0),
        children: <Widget>[
          //add event form
          FormBuilder(
            key: _formKey,
            child: Column(
              children: [
                FormBuilderTextField(
                  name: "title",
                  initialValue: widget.event?.title,
                  decoration: InputDecoration(
                      hintText: "Add Title",
                      border: InputBorder.none,
                      contentPadding: const EdgeInsets.only(left: 48.0)),
                ),
                Divider(),
                FormBuilderTextField(
                  name: "description",
                  initialValue: widget.event?.description,
                  minLines: 1,
                  maxLines: 5,
                  decoration: InputDecoration(
                      hintText: "Add Details",
                      border: InputBorder.none,
                      prefixIcon: Icon(Icons.short_text)),
                ),
                Divider(),
                FormBuilderSwitch(
                  name: "public",
                  initialValue: widget.event?.public ?? false,
                  title: Text("Public"),
                  controlAffinity: ListTileControlAffinity.leading,
                  decoration: InputDecoration(
                    border: InputBorder.none,
                  ),
                ),
                Divider(),
                Neumorphic(
                  style: NeumorphicStyle(color: Colors.white),
                  child: Column(
                    children: [
                      GestureDetector(
                          child: Text(
                              DateFormat('EEE, MMM dd, yyyy')
                                  .format(_startDate),
                              textAlign: TextAlign.left),
                          onTap: () async {
                            final DateTime? date = await showDatePicker(
                              context: context,
                              initialDate: _startDate,
                              firstDate: DateTime(2000),
                              lastDate: DateTime(2100),
                            );

                            if (date != null && date != _startDate) {
                              setState(() {
                                final Duration difference =
                                    _endDate.difference(_startDate);
                                _startDate = DateTime(
                                    date.year,
                                    date.month,
                                    date.day,
                                    _startTime.hour,
                                    _startTime.minute,
                                    0);
                                _endDate = _startDate.add(difference);
                                _endTime = TimeOfDay(
                                    hour: _endDate.hour,
                                    minute: _endDate.minute);
                              });
                            }
                          }),
                      Container(
                        child: FormBuilderDateTimePicker(
                          name: "Time End",
                          initialValue: widget.selectedDate ??
                              widget.event?.date ??
                              DateTime.now(),
                          initialDate: DateTime.now(),
                          fieldHintText: "Add Date",
                          initialDatePickerMode: DatePickerMode.day,
                          inputType: InputType.both,
                          format: DateFormat('EEE, dd MMM, yyyy HH:mm'),
                          decoration: InputDecoration(
                            border: InputBorder.none,
                            prefix: Text('           '),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

Error




to 키워드는 처음 사용할 때 속성이 초기화됨을 의미합니다.

다음과 같이 초기화할 수 있습니다.

late DateTime _startDate = DateTime.now();

그리고 다른 값들을 각각 변경할 뿐만 아니라




위젯을 사용할 때 as 값을 전달하지만 사전에 값을 할당하지 않은 경우 이 오류가 발생합니다. 사용하기 전에 초기 값을 지정해 보십시오.




다음 코드도 사용할 수 있습니다.

   DateTime? _startDate;



나는 정확히 문제가 있다. 일부 개체는 직접 초기화하지 않아야 하므로 늦게 생성됩니다. 예를 들어 파일 개체를 생성할 때 초기화하지 않고 나중에 늦게 사용하지만 flot에서 error.strong 텍스트를 반환합니다.

So run: flot run --release


반응형