可以为 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(!)

解决了同样的问题

希望对某人有所帮助。谢谢