Tμr*_*μrf 24 stream dart flutter flutter-animation dart-null-safety
我收到“可为空表达式”错误。问题出现在以下几行中:
left: isSideBarOpenedAsync.data ? 0 : 0,
right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,
Run Code Online (Sandbox Code Playgroud)
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,
),
),
),
),
],
),
);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
mrg*_*t96 30
如果您知道isSideBarOpenedAsync.data始终有一个值,则可以使用 a!强制该值不为空。
isSideBarOpenedAsync.data!
Run Code Online (Sandbox Code Playgroud)
这会将值的类型从 更改bool?为bool。
您的三元表达式将符合此逻辑。
注意:如果isSideBarOpenedAsync.data使用nulla!会抛出错误,bool cannot be type null.
或者,您可以提供一个要使用的值(如果该值是)null
(isSideBarOpenedAsync.data ?? false)
Run Code Online (Sandbox Code Playgroud)
如果isSideBarOpenedAsync.data有非空值,它将被引用。如果值为null,false将改为使用。
有关空安全问题的更多说明,请在此处分享一些信息
有 3 种方法来处理 null :
1. ?. 运算符 - 通过使用简单语法,值是否为 Null。
data?.variable;
Run Code Online (Sandbox Code Playgroud)
2.?? 运算符- 具有 Null 值,我们也可以传递默认值,例如
variable ?? "";
Run Code Online (Sandbox Code Playgroud)
3. ??= 运算符 - 变量是否为 Null。如果变量为 Null,那么它将为其分配一个新值
int x = 5;
x ??= 2;
Run Code Online (Sandbox Code Playgroud)
注意:我已经使用 ? 解决了同样的问题。运算符反对bang(!)
愿它能帮助某人。谢谢
| 归档时间: |
|
| 查看次数: |
20387 次 |
| 最近记录: |