阅读 194

Flutter小技巧|通过多样式Cell看断言

前言

我们在构建如微信联系人页类似的 Cell 时,主要有两种。一种是加载网络图片,用来现实我们的联系人;一种是本地图片,用来显示一些系统入口,如公众号等。那么如何优雅的完成这样对两种形式数据展示的 Cell 呢?借助这个场景,我们来了解一下 断言

10-01.png

不使用断言

这样的代码,并没有什么明显问题。

  • 普通联系人传入 avatarUrl 网络图片

  • 系统入口传入 assetName 资源名称

  • avatarUrl 和 assetName 都是可选字段,即均可为空

这样的隐患是无法保证至少有一个是有值的。下面我们使用断言进行优化,如果两者都为空就会抛出异常。

class _ContactCell extends StatelessWidget {   const _ContactCell({     required this.name,     this.avatarUrl,     this.assetName,   });   final String name;   final String? avatarUrl;   final String? assetName;   @override   Widget build(BuildContext context) {     return Container(       height: 60,       color: Colors.white,       child: Stack(         children: [           Row(             children: [               Row(                 children: [                   const SizedBox(                     width: 12,                   ),                   avatarUrl != null                       ? Container(                           width: 48,                           height: 48,                           decoration: BoxDecoration(                             borderRadius: BorderRadius.circular(4),                             image: DecorationImage(                               image: NetworkImage(avatarUrl!),                             ),                           ),                         )                       : Container(),                   assetName != null                       ? Container(                           width: 48,                           height: 48,                           decoration: BoxDecoration(                             borderRadius: BorderRadius.circular(4),                             image: DecorationImage(                               image: AssetImage(assetName!),                             ),                           ),                         )                       : Container(),                   const SizedBox(                     width: 12,                   ),                   Text(                     name,                     style: const TextStyle(                       fontSize: 16,                       fontWeight: FontWeight.w500,                     ),                   ),                 ],               ),             ],           ),           Positioned(             left: 50,             bottom: 0,             child: Container(               height: 1,               color: Colors.grey,             ),           ),         ],       ),     );   } } 复制代码

使用断言进行优化

这里在构造方法加了断言: assert((avatarUrl != null || assetName != null), '至少一张图片')

如果两者都为空,那么就会抛出如图异常:

10-02.png

class _ContactCell extends StatelessWidget {   const _ContactCell({     required this.name,     this.avatarUrl,     this.assetName,   }) : assert((avatarUrl != null || assetName != null), '至少一张图片');   final String name;   final String? avatarUrl;   final String? assetName;   @override   Widget build(BuildContext context) {     return Container(       height: 60,       color: Colors.white,       child: Stack(         children: [           Row(             children: [               Row(                 children: [                   const SizedBox(                     width: 12,                   ),                   avatarUrl != null                       ? Container(                           width: 48,                           height: 48,                           decoration: BoxDecoration(                             borderRadius: BorderRadius.circular(4),                             image: DecorationImage(                               image: NetworkImage(avatarUrl!),                             ),                           ),                         )                       : Container(),                   assetName != null                       ? Container(                           width: 48,                           height: 48,                           decoration: BoxDecoration(                             borderRadius: BorderRadius.circular(4),                             image: DecorationImage(                               image: AssetImage(assetName!),                             ),                           ),                         )                       : Container(),                   const SizedBox(                     width: 12,                   ),                   Text(                     name,                     style: const TextStyle(                       fontSize: 16,                       fontWeight: FontWeight.w500,                     ),                   ),                 ],               ),             ],           ),           Positioned(             left: 50,             bottom: 0,             child: Container(               height: 1,               color: Colors.grey,             ),           ),         ],       ),     );   } }


作者:Ryukie_Lawliet
链接:https://juejin.cn/post/7031831134241718303


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐