我收到一个“nullable expression”错误。问题发生在以下行中:
left: isSideBarOpenedAsync.data ? 0 : 0,
right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,
其中isSideBarOpenedAsync
是AsyncSnapshot<bool>
类型
这是我得到的错误
不能将可为空的表达式用作条件。在将其用作条件之前,请尝试检查该值是否不是null
。
下面是完整的代码以供参考
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:solaris/constants.dart';
import 'package:rxdart/rxdart.dart';
class SideBar extends StatefulWidget {
@override
_SideBarState createState() => _SideBarState();
}
class _SideBarState extends State<SideBar> with SingleTickerProviderStateMixin<SideBar>{
late AnimationController _animationController;
late StreamController<bool> isSidebarOpenedStreamController;
late Stream<bool> isSideBarOpenedStream;
late StreamSink<bool> isSideBarOpenedSink;
final _animationDuration = const Duration(milliseconds: 500);
@override
void initState(){
super.initState();
_animationController = AnimationController(vsync: this, duration: _animationDuration);
isSidebarOpenedStreamController = PublishSubject<bool>();
isSideBarOpenedStream = isSidebarOpenedStreamController.stream;
isSideBarOpenedSink = isSidebarOpenedStreamController.sink;
}
@override
void dispose(){
_animationController.dispose();
isSidebarOpenedStreamController.close();
isSideBarOpenedSink.close();
super.dispose();
}
void onIconPressed(){
final animationStatus = _animationController.status;
final isAnimationCompleted = animationStatus == AnimationStatus.completed;
if(isAnimationCompleted){
isSideBarOpenedSink.add(false);
_animationController.reverse();
}else{
isSideBarOpenedSink.add(true);
_animationController.forward();
}
}
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return StreamBuilder<bool>(
initialData: false,
stream: isSideBarOpenedStream,
builder: (context, isSideBarOpenedAsync){
return AnimatedPositioned(
duration: _animationDuration,
top: 0,
bottom: 0,
left: isSideBarOpenedAsync.data ? 0 : 0,
right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,
child: Row(
children: <Widget>[
Expanded(
child: Container(
color: red,
),
),
Align(
alignment: Alignment(0,-0.9),
child: GestureDetector(
onTap: (){
onIconPressed();
},
child: Container(
width: 35,
height: 110,
color: blue,
alignment: Alignment.centerLeft,
child: AnimatedIcon(
progress: _animationController.view,
icon: AnimatedIcons.menu_close,
color: white,
size: 25,
),
),
),
),
],
),
);
},
);
}
}
3条答案
按热度按时间ndasle7k1#
如果你知道
isSideBarOpenedAsync.data
总是有一个值,你可以使用!
来强制这个值不为空。这会将值的类型从
bool?
更改为bool
。您的三元表达式将与此逻辑一起工作。
**注意:**如果
isSideBarOpenedAsync.data
是null
,使用!
会抛出错误,bool cannot be type null
。或者,如果值为
null
,则可以提供要使用的值如果
isSideBarOpenedAsync.data
有一个非空值,它将被引用。如果值是null
,则将使用false
。6yt4nkrj2#
有关空安全问题的更多说明,请在此处分享一些信息
有三种方法可以处理null:
1.?.运算符-使用简单语法判断值是否为Null。
2.??运算符-具有Null值,我们也可以传递默认值,如
3.??=运算符-变量是否为Null,如果变量为Null,则会为其赋新值
注意:我已经使用**?.运算符对bang(!)**解决了同样的问题
希望它能帮助到别人谢谢
6rqinv9w3#
我遇到了同样的问题:即使我们在代码中的同一个地方做示例工作,我也解决了这个问题,如下所示
当我尝试“数据!?“时,我解决了这个问题
我尝试的其他解决方案:
right:isSideBarOpenedAsync.data!= null && isSideBarOpenedAsync.data?0:screenWidth - 45,
right:isSideBarOpenedAsync.hasData &&!isSideBarOpenedAsync.data!?screenWidth - 45:0,
这些事情发生了。