gpt4 book ai didi

flutter - 可为空的表达式不能用作条件

转载 作者:行者123 更新时间:2023-12-04 12:20:23 24 4
gpt4 key购买 nike

我有“可为空表达式”的问题。问题出在这两行:left: isSideBarOpenedAsync.data ? 0 : 0,right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,我正在尝试用动画打开侧边栏菜单。一些想法来解决这个问题?泰。
这是错误:错误:“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将被使用。

关于flutter - 可为空的表达式不能用作条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67740163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com