dart 可空表达式不能用作条件

disbfnqx  于 2023-04-09  发布在  其他
关注(0)|答案(3)|浏览(147)

我收到一个“nullable expression”错误。问题发生在以下行中:

left: isSideBarOpenedAsync.data ? 0 : 0,
right: isSideBarOpenedAsync.data ? 0 : screenWidth - 35,

其中isSideBarOpenedAsyncAsyncSnapshot<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,
                    ),
                  ),
                ),
              ),
            ],
          ),
        );
      },
    );
  }
}
ndasle7k

ndasle7k1#

如果你知道isSideBarOpenedAsync.data总是有一个值,你可以使用!来强制这个值不为空。

isSideBarOpenedAsync.data!

这会将值的类型从bool?更改为bool
您的三元表达式将与此逻辑一起工作。

**注意:**如果isSideBarOpenedAsync.datanull,使用!会抛出错误,bool cannot be type null

或者,如果值为null,则可以提供要使用的值

(isSideBarOpenedAsync.data ?? false)

如果isSideBarOpenedAsync.data有一个非空值,它将被引用。如果值是null,则将使用false

6yt4nkrj

6yt4nkrj2#

有关空安全问题的更多说明,请在此处分享一些信息

有三种方法可以处理null:

1.?.运算符-使用简单语法判断值是否为Null。

data?.varibale;

2.??运算符-具有Null值,我们也可以传递默认值,如

variable ?? "";

3.??=运算符-变量是否为Null,如果变量为Null,则会为其赋新值

int x = 5;
x ??= 2;

注意:我已经使用**?.运算符对bang(!)**解决了同样的问题
希望它能帮助到别人谢谢

6rqinv9w

6rqinv9w3#

我遇到了同样的问题:即使我们在代码中的同一个地方做示例工作,我也解决了这个问题,如下所示

left: isSideBarOpenedAsync.data! ?  0:0, right:isSideBarOpenedAsync.data! ? 0: screenWidth -45,

当我尝试“数据!?“时,我解决了这个问题
我尝试的其他解决方案:

left: isSideBarOpenedAsync.data != null && isSideBarOpenedAsync.data ? 0 : 0,

right:isSideBarOpenedAsync.data!= null && isSideBarOpenedAsync.data?0:screenWidth - 45,

left: isSideBarOpenedAsync.hasData && isSideBarOpenedAsync.data! ? 0 : 0,

right:isSideBarOpenedAsync.hasData &&!isSideBarOpenedAsync.data!?screenWidth - 45:0,
这些事情发生了。

相关问题