英文:
Flutter: Trying to display a widget conditionally based on whether a bool is true or false
问题
我想根据一个布尔类型的变量是true还是false来显示一个小部件。但是我遇到了错误:_TypeError(类型'Null'不是类型'Widget'的子类型)。
import 'package:expense_tracker/Models/expense.dart';
import 'package:flutter/material.dart';
class ExpensesItem extends StatelessWidget {
  const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,});
  final Expense expense;
  final bool isAdditionalDisplayed; //这里是布尔变量
  _displayAdditional() {
    if(isAdditionalDisplayed == true) {
      return Column(
        children: [
          Row(
            children: [
              SizedBox(
                height: 100,
                width: 360,
                child: Text(expense.additional))],
                )
              ],
            );
    }
    if(isAdditionalDisplayed == false) {
      return SizedBox(height: 0,);
    }
  } //这里我检查_displayAdditional是true还是false。如果是true,就显示小部件,如果是false,就显示一个空的SizedBox。
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.symmetric(
          horizontal: 20,
          vertical: 16,
        ),
        child: Column(
          children: [
            Text(expense.title),
            const SizedBox(height: 4),
            Column(
              children: [
                Row(
                  children: [
                    SizedBox(
                      height: 100,
                      width: 360,
                      child: Text(expense.additional))],
                )
              ],
            ),
            _displayAdditional(), //这里应该显示小部件。这是我遇到错误的地方
          ],
        ),
      ),
    );
  }
}
尝试在第二个if语句中添加检查_isAdditionalDisplayed是否为null的条件。这将导致错误,表示它不能为null,并且始终为false:
if(isAdditionalDisplayed == false || isAdditionalDisplayed == null) {
错误:
操作数不能为null,因此条件始终为“false”。
尝试删除条件、包含条件或整个条件语句。
尝试在调用_displayAdditional时添加感叹号:
_displayAdditional()!,
错误:
_TypeError(在空值上使用了空值检查运算符)
如果同时进行这两种更改,将会同时出现这两种错误。如果只进行其中一种更改,将会出现其中一种错误。
这很令人困惑。在一个地方它说isAdditionalDisplayed不能为null,在另一个地方它说它是null。
英文:
I want to display a widget based on whether a variable that is a bool is true or false. However I get the error: _TypeError (type 'Null' is not a subtype of type 'Widget').
import 'package:expense_tracker/Models/expense.dart';
import 'package:flutter/material.dart';
class ExpensesItem extends StatelessWidget {
  const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,});
  final Expense expense;
  final bool isAdditionalDisplayed; //HERE IS THE BOOL VARIABLE
  _displayAdditional() {
    if(isAdditionalDisplayed == true) {
      Column(
        children: [
          Row(
            children: [
              SizedBox(
                height: 100,
                width: 360,
                child: Text(expense.additional))],
                )
              ],
            );
    }
    if(isAdditionalDisplayed == false) {
      SizedBox(height: 0,);
    }
  } //HERE I ASK IF _DISPLAYADDITIONAL IS TRUE OR FALSE. IF ITS TRUE IT DISPLAYS THE WIDGET, IF IT'S FALSE IT DISPLAYS AN EMPTY SIZEDBOX.
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.symmetric(
          horizontal: 20,
          vertical: 16,
        ),
        child: Column(
          children: [
            Text(expense.title),
            const SizedBox(height: 4),
            Column(
              children: [
                Row(
                  children: [
                    SizedBox(
                      height: 100,
                      width: 360,
                      child: Text(expense.additional))],
                )
              ],
            ),
            _displayAdditional(), //HERE THE WIDGET SHOULD BE DISPLAYED. THIS IS WHERE I GET THE ERROR
          ],
        ),
      ),
    );
  }
}
Tried adding to the 2nd if statement to check if _isAdditionalDisplayed is null. This gives the error that it can't be null and will always be false:
if(isAdditionalDisplayed == false || isAdditionalDisplayed == null) {
Error:
The operand can't be null, so the condition is always 'false'.
Try removing the condition, an enclosing condition, or the whole conditional statement.
Tried adding an exclimation mark when _displayAdditional is called:
_displayAdditional()!,
Error:
_TypeError (Null check operator used on a null value)
With both of those changes at once I get both errors. With one or the other I get one or the other errors.
This is very confusing. In one place it's saying isAdditionalDisplayed can't be null. In another it's saying it is null.
答案1
得分: 1
看起来问题在于你没有从函数中返回小部件。
import 'package:expense_tracker/Models/expense.dart';
import 'package:flutter/material.dart';
class ExpensesItem extends StatelessWidget {
  const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,});
  final Expense expense;
  final bool isAdditionalDisplayed;
  Widget _displayAdditional() {
    return isAdditionalDisplayed ? Column(
        children: [
          Row(
            children: [
              SizedBox(
                height: 100,
                width: 360,
                child: Text(expense.additional))],
                )
              ],
            ) : SizedBox.shrink();
  }
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.symmetric(
          horizontal: 20,
          vertical: 16,
        ),
        child: Column(
          children: [
            Text(expense.title),
            const SizedBox(height: 4),
            Column(
              children: [
                Row(
                  children: [
                    SizedBox(
                      height: 100,
                      width: 360,
                      child: Text(expense.additional))],
                )
              ],
            ),
            _displayAdditional(), 
          ],
        ),
      ),
    );
  }
}
英文:
Looks like the issue is you are not returning the widgets from the function.
import 'package:expense_tracker/Models/expense.dart';
import 'package:flutter/material.dart';
class ExpensesItem extends StatelessWidget {
  const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,});
  final Expense expense;
  final bool isAdditionalDisplayed;
  Widget _displayAdditional() {
    return isAdditionalDisplayed ? Column(
        children: [
          Row(
            children: [
              SizedBox(
                height: 100,
                width: 360,
                child: Text(expense.additional))],
                )
              ],
            ) : SizedBox.shrink();
  }
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.symmetric(
          horizontal: 20,
          vertical: 16,
        ),
        child: Column(
          children: [
            Text(expense.title),
            const SizedBox(height: 4),
            Column(
              children: [
                Row(
                  children: [
                    SizedBox(
                      height: 100,
                      width: 360,
                      child: Text(expense.additional))],
                )
              ],
            ),
            _displayAdditional(), 
          ],
        ),
      ),
    );
  }
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论