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

Flutter/Dart中SimpleDialog类的正确放置与调用方法

问题1:_askedToLead方法正确性与放置位置

你写的方法存在几处错误,不需要封装为独立类,直接作为_ListFromCSVState的成员方法放置即可,和现有_loadCSV、_nextCSV方法同级。
现有写法的问题:

  • 未定义Question枚举类型,属于缺失定义
  • showDialog的context参数后缺失逗号,存在语法错误
  • 弹窗标题、选项文本是从CSV动态读取的内容,使用const修饰会导致编译报错
  • 未做数组长度、空值判断,CSV加载未完成或某行列数不足时会触发越界报错
  • 未限制弹窗点击外部关闭,用户可能跳过问题交互

修正步骤:

  1. 先在文件顶部、类定义外补充枚举定义,用于区分用户选择的答案:
enum QuestionAnswer { answer1, answer2 }
  1. 替换原有方法为修正后的版本:
Future<void> _showQuestionDialog() async {
  // 当前行问题字段为空时直接不弹窗
  if (_listData[_listCount].length < 3 || _listData[_listCount][2].toString().trim().isEmpty) {
    return;
  }
  final selected = await showDialog<QuestionAnswer>(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return SimpleDialog(
        title: Text(_listData[_listCount][2].toString()),
        children: <Widget>[
          SimpleDialogOption(
            onPressed: () { Navigator.pop(context, QuestionAnswer.answer1); },
            child: Text(_listData[_listCount][3].toString()),
          ),
          SimpleDialogOption(
            onPressed: () { Navigator.pop(context, QuestionAnswer.answer2); },
            child: Text(_listData[_listCount][4].toString()),
          ),
        ],
      );
    }
  );

  switch (selected) {
    case QuestionAnswer.answer1:
      // 在此处编写选择第一个答案后的业务逻辑,如剧情跳转、属性变更
      break;
    case QuestionAnswer.answer2:
      // 在此处编写选择第二个答案后的业务逻辑
      break;
    case null:
      // 弹窗异常关闭时的兜底逻辑
      break;
  }
}
问题2:_nextCSV方法修改方案

你原有_nextCSV的三元表达式嵌套可读性差,且异步弹窗不能直接写在setState内部,需要等状态更新、页面重绘完成后再触发弹窗。修正后的代码如下:

void _nextCSV() {
  // 处理条目计数逻辑
  if (_listCount < _listData.length - 1) {
    if (_isFirstLoad) {
      _isFirstLoad = false;
    } else {
      _listCount++;
    }
  }
  // 计算新的背景图路径
  final newAssetPath = _listData[_listCount].length >= 2 && _listData[_listCount][1].toString().isNotEmpty
      ? _listData[_listCount][1].toString()
      : assetPath;

  setState(() {
    assetPath = newAssetPath;
  });

  // 页面渲染完成后检查是否弹出问题窗
  WidgetsBinding.instance.addPostFrameCallback((_) {
    _showQuestionDialog();
  });
}

额外必要修复

你的_loadCSV是异步方法,首屏加载完第一条CSV数据后如果存在问题也需要弹窗,修改原有_loadCSV方法如下:

void _loadCSV() async {
  String rawData = await rootBundle.loadString("files/Text.csv");
  _listData = const CsvToListConverter().convert(rawData);
  final firstPath = _listData[_listCount].length >=2 && _listData[_listCount][1].toString().isNotEmpty
      ? _listData[_listCount][1].toString()
      : "files/main.jpg";
  setState(() {
    assetPath = firstPath;
  });
  // 首屏渲染完成后检查是否弹出问题窗
  WidgetsBinding.instance.addPostFrameCallback((_) {
    _showQuestionDialog();
  });
}

所有读取CSV列的位置都加了长度判断,避免某行列数不足时触发数组越界崩溃。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:16