必须向文本小部件提供非空字符串显示错误,但空安全性不适用于代码

zsohkypk  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(281)

我是一名编程新手,并且正在学习一门没有空安全性的老课程。我试图通过插入一个默认值来解决这个问题,但这只会使按钮上的所有文本都有“默认值”一词。

// @dart=2.9

import 'package:flutter/material.dart';

class Answer extends StatelessWidget {
  final Function selectHandler;
  final String answerText;

  Answer(this.selectHandler, this.answerText);

  @override
  Widget build(BuildContext context) {
    return Container(
        width: double.infinity,
        child: RaisedButton(
          color: Colors.red.shade400,
          textColor: Colors.white,

          child: Text(answerText?? 'default value'),

          onPressed: selectHandler,
        ));
  }
}

编辑:
答案类在这里被调用:

// @dart=2.9

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import './question.dart';
import './answer.dart';

class Quiz extends StatelessWidget {
  final List<Map<String, Object>> questions;
  final int questionIndex;
  final Function answerQuestion;

  Quiz(
      {@required this.questions,
      @required this.answerQuestion,
      @required this.questionIndex});

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        Question(
         questions[questionIndex]['questionText']?? "default value",
        ),
        ...(questions[questionIndex]['answers'] as List<Map<String, Object>>)
            .map((answer) {
          return Answer(() => answerQuestion(answer['score']), answer['text']);
        }).toList()
      ],
    );
  }
}
hjzp0vay

hjzp0vay1#

在零安全镖中,一个 String 将永远不会为null,因此无法使用 ?? 一串之后。但是,您可以定义 answerText 作为一个 String? 这将使其成为可为空的字符串。有关更多详细信息,请访问此网站。
上面的解释可以使程序运行,但在任何地方设置默认值都不是一种好的编码方式。当您或您的团队试图调试您的代码时,这将导致很多麻烦。更好的做法是在启动对象时设置默认值:

class Answer extends StatelessWidget {
  final void Function()? selectHandler;
  final String answerText;

  Answer(void Function()? selectHandler, String? answerText)
      : selectHandler = selectHandler,
        answerText = answerText ?? 'default value';

  @override
  Widget build(BuildContext context) {
    return Container(
        width: double.infinity,
        child: RaisedButton(
          color: Colors.red.shade400,
          textColor: Colors.white,
          child: Text(answerText),
          onPressed: selectHandler,
        ));
  }
}

相关问题