You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter开发遇LateInitializationError,求解决代码示例

解决LateInitializationError问题

你的问题核心是未初始化的late变量被提前访问,改成可空类型后没有正确处理空值判断,导致问题延续。以下是修复步骤和完整代码:

修复核心要点

  • 将late DateTime _selectDate改为DateTime? _selectDate;(明确声明为可空类型,无需late修饰)
  • 在所有使用_selectDate的位置,先判断是否为空,非空状态下再进行格式化等操作
  • 移除冗余的late String titleInput和late String amountInput(已通过控制器获取输入,无需额外变量)

修复后的完整代码

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class NewTransaction extends StatefulWidget {
  final Function addTx;

  NewTransaction(this.addTx);

  @override
  State<NewTransaction> createState() => _NewTransactionState();
}

class _NewTransactionState extends State<NewTransaction> {
  final _titleController = TextEditingController();
  final _amountController = TextEditingController();
  DateTime? _selectDate;

  void _submitData() {
    final enteredTitle = _titleController.text;
    final enteredAmountText = _amountController.text;

    // 增强输入校验:避免空值、无效金额
    if (enteredTitle.isEmpty ||
        enteredAmountText.isEmpty ||
        double.tryParse(enteredAmountText) == null ||
        double.parse(enteredAmountText) <= 0) {
      return;
    }

    final enteredAmount = double.parse(enteredAmountText);
    widget.addTx(enteredTitle, enteredAmount);

    Navigator.of(context).pop();
  }

  void _presentDatePicker() {
    showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(2023),
      lastDate: DateTime.now(),
    ).then((value) {
      if (value == null) return;
      setState(() {
        _selectDate = value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 5,
      child: Container(
        padding: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.end,
          children: [
            TextField(
              decoration: const InputDecoration(labelText: 'Title'),
              controller: _titleController,
              onSubmitted: (_) => _submitData(),
            ),
            TextField(
              decoration: const InputDecoration(labelText: 'Amount'),
              controller: _amountController,
              keyboardType: TextInputType.numberWithOptions(decimal: true),
              onSubmitted: (_) => _submitData(),
            ),
            Container(
              height: 70,
              child: Row(
                children: [
                  Expanded(
                    child: Text(
                      _selectDate == null
                          ? 'No Date Chosen!'
                          : 'Picked Date: ${DateFormat.yMd().format(_selectDate!)}',
                    ),
                  ),
                  TextButton(
                    child: Text(
                      'Choose Date',
                      style: TextStyle(
                        color: Theme.of(context).primaryColor,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    onPressed: _presentDatePicker,
                  )
                ],
              ),
            ),
            ElevatedButton(
              onPressed: _submitData,
              child: Text(
                _selectDate == null
                    ? 'Add Transaction'
                    : 'Add with Date: ${DateFormat.yMd().format(_selectDate!)}',
              ),
              style: ElevatedButton.styleFrom(
                backgroundColor: Theme.of(context).primaryColor,
                foregroundColor: Theme.of(context).textTheme.button?.color,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

额外优化说明

  1. 给金额输入框添加了keyboardType,优化数字输入体验
  2. 将已弃用的MaterialButton替换为TextButton和ElevatedButton,符合Flutter最新组件规范
  3. 增强提交校验逻辑,避免空字符串转double时抛出异常

内容的提问来源于stack exchange,提问作者Ahmed Helmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:45:00