Flutter LateInitializationError排查:transaction未初始化问题
解决LateInitializationError: Field 'transaction' has not been initialized错误
问题根源
错误出在transaction_item.dart的_TransactionItemState类中:你声明了late final Transaction? transaction和late final Function deleteTx两个延迟初始化变量,但从未给它们赋值,导致组件渲染时触发未初始化错误。
修复方案(推荐)
直接通过widget.xxx访问StatefulWidget的属性,无需在State类中重复声明变量,这是Flutter的标准写法,更简洁安全。
修改后的transaction_item.dart代码:
// ignore_for_file: deprecated_member_use import 'dart:math'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../models/transaction.dart'; class TransactionItem extends StatefulWidget { const TransactionItem({ Key? key, required this.transaction, required this.deleteTx, }) : super(key: key); // 因传入的tx来自非空列表,去掉可空标记,避免强制解包 final Transaction transaction; final Function deleteTx; @override State<TransactionItem> createState() => _TransactionItemState(); } class _TransactionItemState extends State<TransactionItem> { late Color _bgColor; @override void initState() { const availableColors = [ Colors.red, Colors.blue, Colors.pink, Colors.purple, ]; _bgColor = availableColors[Random().nextInt(4)]; super.initState(); } @override Widget build(BuildContext context) { return Card( margin: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), elevation: 5, child: ListTile( leading: CircleAvatar( backgroundColor: _bgColor, radius: 33, child: Padding( padding: const EdgeInsets.all(6), child: FittedBox( child: Text('\$ ${widget.transaction.price}'), ), ), ), title: Text( widget.transaction.title, style: Theme.of(context).textTheme.titleSmall, ), subtitle: Text( DateFormat.yMMMd().format(widget.transaction.date), ), trailing: MediaQuery.of(context).size.width > 460 ? FlatButton.icon( onPressed: () => widget.deleteTx(widget.transaction.id), icon: const Icon(Icons.delete), label: const Text('Delete'), textColor: Theme.of(context).errorColor, ) : IconButton( icon: const Icon(Icons.delete), color: Theme.of(context).errorColor, onPressed: () => widget.deleteTx(widget.transaction.id), ), ), ); } }
额外优化点
- 移除了过时的
@required注解,改用Dart官方推荐的required关键字 - 去掉了
transaction的可空标记?:因为从TransactionList传入的tx来自非空的transactions列表,无需处理空值情况,避免代码中使用!强制解包的潜在风险
备选修复方案(不推荐)
如果一定要在State类中声明变量,必须在initState方法中完成初始化:
@override void initState() { super.initState(); const availableColors = [ Colors.red, Colors.blue, Colors.pink, Colors.purple, ]; // 给延迟初始化变量赋值 transaction = widget.transaction; deleteTx = widget.deleteTx; _bgColor = availableColors[Random().nextInt(4)]; }
内容的提问来源于stack exchange,提问作者Abu Bakkar Siddik Rana
相关产品推荐
相关产品推荐

