Flutter StreamBuilder<运算符报空安全错误,添加!空检查仍无法解决怎么办
报错原因
这个报错是Dart空安全机制和泛型类型提升限制共同导致的:
- 你没有给
StreamBuilder指定泛型,编译器无法推断snapshot.data的具体类型,默认会识别为Object?类型,即使你加了空断言!,Object类型也无法直接和int类型做大小比较,这就是你之前加了!依旧报错的核心原因。 AsyncSnapshot的data属于泛型类的属性,即使你提前做了hasData非空判断,Dart也不会对类属性做自动类型提升,所以还是会判定data有可能为空。
正确解决方案
有两种常用的修复方式:
方案1:指定泛型+空断言(最简单)
给StreamBuilder明确指定泛型为int(因为你用的Stream.periodic发射的是int类型数据),再给data加空断言即可:
@override Widget build(BuildContext context) { // 给StreamBuilder加<int>泛型声明 return StreamBuilder<int>( stream:Stream.periodic(Duration(seconds: 3),(a)=>a), builder: (ctx, snapshot){ return Scaffold( appBar: AppBar(title: Text( (snapshot.hasData && snapshot.data! < 10)?"${snapshot.data}":"demo"), ), body: Center( child: snapshot.connectionState==ConnectionState.waiting?CircularProgressIndicator():Text("done"), ), ); },); }
方案2:本地变量暂存(无需空断言,更安全)
用本地变量暂存snapshot.data的值,Dart会对本地变量做自动类型提升,判空后无需再加空断言:
@override Widget build(BuildContext context) { return StreamBuilder<int>( stream:Stream.periodic(Duration(seconds: 3),(a)=>a), builder: (ctx, snapshot){ // 用本地变量暂存data值 final data = snapshot.data; return Scaffold( appBar: AppBar(title: Text( (snapshot.hasData && data < 10)?"$data":"demo"), ), body: Center( child: snapshot.connectionState==ConnectionState.waiting?CircularProgressIndicator():Text("done"), ), ); },); }
内容的提问来源于stack exchange,提问作者Amal yosri
相关产品推荐
相关产品推荐

