Flutter ListView.builder报错:操作数非空与返回类型不匹配求助
Flutter ListView.builder 错误排查与解决
出现的错误信息
The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand The return type 'Object' isn't a 'Widget', as required by the closure's context
相关代码
newNotifications 列表
List newNotification = ['liked', 'follow'];
ListView.builder 代码
ListView.builder( itemCount: newNotification.length, itemBuilder: (context, index) { return newNotification[index] == 'follow' ?? PictureTile():NotificationTile1(); },),
PictureTile 组件
class PictureTile extends StatelessWidget { const PictureTile({super.key}); @override Widget build(BuildContext context) { return Row( children: [ SizedBox( height: 70, width: 70, child: Stack( children: const [ Padding( padding: EdgeInsets.only(left: 10), child: CircleAvatar( radius: 25, backgroundImage: AssetImage('assets/images/ico-modified-rem.png'), ), ), Positioned( bottom: 10, child: CircleAvatar( radius: 25, backgroundImage: AssetImage('assets/images/sha-modified.png'), ), ), ], ), ), const SizedBox(width: 10), Expanded( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: const [ Text( 'Order Confirmation', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), SizedBox( height: 5, ), Text( 'Order Cancelled', style: TextStyle( fontSize: 13, color: Colors.black54, ), ), const SizedBox(height: 5), Text( 'You ordered Shawarma', style: TextStyle( fontSize: 13, ), ), ], ), ), Image.asset( 'assets/images/chicken-shawarma-modified.png', height: 95, width: 91, ), ], ); } }
NotificationTile1 组件
class NotificationTile1 extends StatefulWidget { const NotificationTile1({super.key}); @override State<NotificationTile1> createState() => _NotificationTile1State(); } class _NotificationTile1State extends State<NotificationTile1> { @override Widget build(BuildContext context) { return Row( children: [ TileImg('assets/images/ico-modified-rem.png'), const SizedBox( width: 15, ), Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: const [ Text( 'Order Confirmation', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), SizedBox( height: 5, ), Text( 'Order Successful', style: TextStyle( fontSize: 13, color: Colors.black54, ), ), SizedBox( height: 5, ), Text( 'You ordered Shawarma', style: TextStyle( fontSize: 13, ), ), ], ), ], ); } }
问题原因与解决
核心错误
你把三元运算符和空合并运算符搞混了:
- 三元运算符的正确写法是
条件 ? 表达式1 : 表达式2,用于根据布尔条件返回两个值中的一个 ??是空合并运算符,作用是当左侧为null时返回右侧值,否则返回左侧值。你这里左侧是newNotification[index] == 'follow'(布尔值,不可能为null),所以编译器报错说右侧永远不会执行
同时,错误的运算符写法导致编译器无法识别返回的是Widget类型,所以提示返回类型是Object不符合要求。
修正后的代码
把??改成?即可,修正后的ListView.builder代码:
ListView.builder( itemCount: newNotification.length, itemBuilder: (context, index) { return newNotification[index] == 'follow' ? PictureTile() : NotificationTile1(); }, ),
关于可空类型的疑问
不需要把PictureTile()或NotificationTile1()设为可空类型,因为这里的问题完全是运算符使用错误导致的,和可空性无关。这两个组件本身都是非空的Widget,符合itemBuilder的返回要求。
内容的提问来源于stack exchange,提问作者shimomaru
相关产品推荐
相关产品推荐

