Flutter 空安全的糖果罐,墙都不扶就服你

本文介绍了Flutter的空安全对应用开发的影响,强调了在使用TabBarView、文本、输入框等组件时的注意事项。同时,推荐了如ExtendedTabs、ExtendedText和ExtendedTextField等扩展库,以提升开发效率。还介绍了ff_annotation_route库用于路由管理和迁移至空安全的步骤,并展示了如何处理空安全问题,特别是List类型的长度设置变化。
摘要由CSDN通过智能技术生成
  • SliverPinnedPersistentHeader,跟官方的SliverPersistentHeader(pinned: true) 一样的效果, 不同的是你不需要去设置 minExtentmaxExtent。因为大部分场景下面,我们是无法提前知道 minExtentmaxExtent
  • SliverPinnedToBoxAdapter,可以通过它轻松创建一个置顶的元素,当 child 没有 layout 之前,你没法知道 child 的实际大小,这将是非常有用的组件。
  • ExtendedSliverAppbar,你可以创建一个跟 SliverAppbar 一样效果的组件,而不用去关心 expandedHeight

extended_sliver.gif

TabBarView 扩展

ExtendedTabs,对 TabBarView 组件的扩展,主要包括以下功能:

  • 解决多级 TabBarView 嵌套的时候,无法连贯切换的问题
  • 垂直方向滚动
  • 设置缓存页面数量
  • 提供 CarouselIndicatorColorTabIndicator
link.gif [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hssSlu30-1637210521867)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/063fc96756c5475592cd75bc477bafc6~tplv-k3u1fbpfcp-watermark.image)]

文本

ExtendedText,针对 Text 组件的扩展,主要包括以下功能:

  • 方便快速生成特殊文本,将字符串转换成特定的 InlineSpan
  • BackgroundTextSpan 自定文字背景,处理圆角或者中英文背景高度不一致的问题。
  • ExtendedWidgetSpan 支持选择和复制, github.com/flutter/flu… .
  • TextOverflowWidget 自定义文本溢出效果, github.com/flutter/flu…
special_text.jpg overflow.jpg
background.png selection.gif

输入框

ExtendedTextField,针对 TextField 组件的扩展,主要包括以下功能:

  • 方便快速生成特殊文本,原理很简单,就是把字符串转换成特定的 InlineSpan
  • ExtendedWidgetSpan 支持输入框中插入任何 Widget,比如表情图片。
  • ExtendedWidgetSpan 支持选择和复制, github.com/flutter/flu…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sAfmfQSz-1637210521871)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d9eb319cafe47e6a7dad6d09fc168b9~tplv-k3u1fbpfcp-watermark.image)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRzqbExw-1637210521878)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/39bac0044f724c258e126fd268b91e4d~tplv-k3u1fbpfcp-watermark.image)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qu5xKDcn-1637210521878)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/41d2c8f1f3b34339bca40249ab0892ff~tplv-k3u1fbpfcp-watermark.image)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVyS4NB3-1637210521879)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/705c6b8c54d24898acc653e37ecc1d82~tplv-k3u1fbpfcp-watermark.image)]

路由注解

ff_annotation_route,通过注解生成路由映射,统一处理路由,支持 Navigator 1.0Navigator 2.0

  1. 激活工具 pub global activate ff_annotation_route
  2. 增加引用

dependencies:

在子模块中引入

ff_annotation_route_core: any

在根项目引入,包括一些帮助类以及 ff_annotation_route_core

ff_annotation_route_library: any

  1. 添加注释

工具会自动处理带参数的构造,不需要做特殊处理。唯一需要注意的是,你需要设置 argumentImports 来为 class/enum 的参数提供 import 地址。现在你也可以使用 @FFArgumentImport()

Flutter 2.0 之后,Dart 默认启用了安全(Null Safety),因此在使用二维码扫描插件时需要使用安全的 API。 对于 `qr_code_scanner` 插件,可以使用 `qr_code_scanner_nullsafety` 包,其使用方式与原始插件基本相同,只是 API 有所改变。以下是一个简单的示例: 1. 添加 `qr_code_scanner_nullsafety` 插件到 `pubspec.yaml` 文件中: ``` dependencies: qr_code_scanner_nullsafety: ^0.5.2 ``` 2. 导入 `qr_code_scanner_nullsafety` 包: ``` import 'package:qr_code_scanner_nullsafety/qr_code_scanner_nullsafety.dart'; ``` 3. 创建一个 `QRViewController` 和一个 `QRView`: ``` QRViewController? controller; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); @override Widget build(BuildContext context) { return QRView( key: qrKey, onQRViewCreated: _onQRViewCreated, ); } void _onQRViewCreated(QRViewController newController) { controller = newController; controller!.scannedDataStream.listen((scanData) { // 处理扫描到的二维码 }); } ``` 注意,`QRViewController` 类型需要加上问号 `?`,表示这个对象可能为。在 `_onQRViewCreated()` 方法中,也需要对 `controller` 进行非判断,确保它不为。 对于 `barcode_scan` 插件,可以使用 `barcode_scan_null_safety` 包,使用方式与原始插件类似。以下是一个简单的示例: 1. 添加 `barcode_scan_null_safety` 插件到 `pubspec.yaml` 文件中: ``` dependencies: barcode_scan_null_safety: ^2.0.1 ``` 2. 导入 `barcode_scan_null_safety` 包: ``` import 'package:barcode_scan_null_safety/barcode_scan_null_safety.dart'; ``` 3. 调用 `scan()` 方法并处理返回的数据: ``` Future<void> scan() async { String barcode = await BarcodeScanner.scan(); // 处理扫描到的二维码 } ``` 对于 `barcode_scan_null_safety`,`scan()` 方法返回的类型为非的 `Future<String>`,不需要进行值检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值