You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在用户未输入时设置默认值?求解释null及??运算符用法

Dart: 为未输入内容的变量设置默认值及相关问题解析

关于null的定义

在Dart的空安全体系中,null表示“无任何有效内容”。只有声明为可空类型(例如String?)的变量才能被赋值为null;非空类型(例如String)的变量必须始终持有一个有效的非null值,编译器会强制检查这一点。

需要注意的是:stdin.readLineSync()的返回类型是String?——当输入流被意外关闭时,它会返回null;但如果用户只是直接回车、没有输入任何字符,它返回的是空字符串"",而非null。

你的代码存在的问题

你提供的代码:

stdout.write("请输入您的名字: ");
final String userName = stdin.readLineSync() ?? "user";
print(userName);

无法满足“用户未输入内容时赋值默认值”的需求。因为当用户直接回车时,stdin.readLineSync()返回的是空字符串"",不是null,此时??(空值合并运算符)不会触发,userName会被赋值为空字符串,而不是你期望的"user"。

正确的实现方案

要同时处理“输入流关闭返回null”和“用户未输入内容返回空字符串”两种场景,可以先捕获输入值,再判断是否为有效内容:

import 'dart:io';

void main() {
  stdout.write("请输入您的名字: ");
  final? String input = stdin.readLineSync();
  // 去除首尾空白后判断是否为空,空值或空字符串都使用默认值
  final String userName = input?.trim().isEmpty != false ? "user" : input!.trim();
  print(userName);
}

或者更简洁的写法:

import 'dart:io';

void main() {
  stdout.write("请输入您的名字: ");
  final trimmedInput = stdin.readLineSync()?.trim() ?? "";
  final String userName = trimmedInput.isEmpty ? "user" : trimmedInput;
  print(userName);
}

这样无论用户是直接回车,还是输入流返回null,userName都会被正确赋值为默认值"user";如果用户输入了内容(包括带空格的内容),则会使用去除首尾空白后的有效输入。

内容的提问来源于stack exchange,提问作者timur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:52:32