可以为 null 的表达式不能用作条件
A nullable expression can't be used as a condition
我对“可空表达式”有疑问。问题出在这两行中:left: isSideBarOpenedAsync.data ? 0 : 0,
和 right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,
我正在尝试用动画打开边栏菜单。解决这个问题的一些想法? Ty.
这是错误:错误:无法将 'bool?' 类型的值分配给 'bool' 类型的变量,因为 'bool?' 可以为空并且'bool' 不是。
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,
),
),
),
),
],
),
);
},
);
}
}
如果您知道 isSideBarOpenedAsync.data
将始终有数据,您可以使用 !
强制该值不为空。
例如:
isSideBarOpenedAsync.data!
。这会将值从 bool?
更改为 bool
。您的三元表达式将使用此逻辑。
注意: 如果 isSideBarOpenedAsync.data
实际上为 null 而您有 !
,那么您将收到一条错误消息说 bool cannot be type null
。
如果您不想要这种行为,您也可以提供一个默认值。
例如:
(isSideBarOpenedAsync.data ?? false)
在这种情况下,如果isSideBarOpenedAsync.data
有值,就会被引用。如果为空,将使用 false
。
有关空安全问题的更多说明,请在此处分享一些信息
有3种方式来处理null :
1. ?。运算符
- 使用简单的语法,值是否为 Null。
data?.varibale;
2。 ??运算符 - 具有空值,我们也可以传递默认值,如
variable ?? "";
3。 ??= 运算符
- 变量是否为 Null。如果变量是 Null 那么它将为其分配一个新值
int x = 5;
x ??= 2;
注意:我已经使用 ?. 运算符针对 bang(!)
解决了同样的问题
希望对某人有所帮助。谢谢
我对“可空表达式”有疑问。问题出在这两行中:left: isSideBarOpenedAsync.data ? 0 : 0,
和 right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,
我正在尝试用动画打开边栏菜单。解决这个问题的一些想法? Ty.
这是错误:错误:无法将 'bool?' 类型的值分配给 'bool' 类型的变量,因为 'bool?' 可以为空并且'bool' 不是。
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,
),
),
),
),
],
),
);
},
);
}
}
如果您知道 isSideBarOpenedAsync.data
将始终有数据,您可以使用 !
强制该值不为空。
例如:
isSideBarOpenedAsync.data!
。这会将值从 bool?
更改为 bool
。您的三元表达式将使用此逻辑。
注意: 如果 isSideBarOpenedAsync.data
实际上为 null 而您有 !
,那么您将收到一条错误消息说 bool cannot be type null
。
如果您不想要这种行为,您也可以提供一个默认值。
例如:
(isSideBarOpenedAsync.data ?? false)
在这种情况下,如果isSideBarOpenedAsync.data
有值,就会被引用。如果为空,将使用 false
。
有关空安全问题的更多说明,请在此处分享一些信息
有3种方式来处理null :
1. ?。运算符 - 使用简单的语法,值是否为 Null。
data?.varibale;
2。 ??运算符 - 具有空值,我们也可以传递默认值,如
variable ?? "";
3。 ??= 运算符 - 变量是否为 Null。如果变量是 Null 那么它将为其分配一个新值
int x = 5;
x ??= 2;
注意:我已经使用 ?. 运算符针对 bang(!)
解决了同样的问题希望对某人有所帮助。谢谢