Flutter/Dart中SimpleDialog类的正确放置与调用方法
问题1:_askedToLead方法正确性与放置位置
你写的方法存在几处错误,不需要封装为独立类,直接作为_ListFromCSVState的成员方法放置即可,和现有_loadCSV、_nextCSV方法同级。
现有写法的问题:
- 未定义
Question枚举类型,属于缺失定义 showDialog的context参数后缺失逗号,存在语法错误- 弹窗标题、选项文本是从CSV动态读取的内容,使用
const修饰会导致编译报错 - 未做数组长度、空值判断,CSV加载未完成或某行列数不足时会触发越界报错
- 未限制弹窗点击外部关闭,用户可能跳过问题交互
修正步骤:
- 先在文件顶部、类定义外补充枚举定义,用于区分用户选择的答案:
enum QuestionAnswer { answer1, answer2 }
- 替换原有方法为修正后的版本:
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
相关产品推荐
相关产品推荐

