Flutter中使用if-else与setState根据PDF下载状态切换UI的问题
问题排查
你的代码存在两个核心错误导致状态无法正常更新:
checkFile检测方法从未被调用,组件初始化后不会自动执行该逻辑,isDownloaded始终停留在初始赋值的truecheckFile内部判断逻辑存在语法错误:缺少else关键字,第二个setState代码块被包裹在if的执行范围内,只要文件存在,会先将isDownloaded设为true,紧接着又覆盖为false,逻辑完全失效
修复代码
class RefCardType extends StatefulWidget { const RefCardType( {Key? key, required this.urlPath, required this.fileName, required this.page, required this.title, required this.cardTitle, required this.cardSubTitle}) : super(key: key); final String urlPath; final String fileName; final int page; final String title; final String cardTitle; final String cardSubTitle; @override _RefCardTypeState createState() => _RefCardTypeState(); } class _RefCardTypeState extends State<RefCardType> { bool isDownloaded = false; @override void initState() { super.initState(); // 组件初始化时立即执行文件检测 checkFile(); } void checkFile() async { File file = File('$localPath/${widget.fileName}'); bool fileExists = await file.exists(); // 单次setState更新状态,无需重复判断 setState(() { isDownloaded = fileExists; }); } @override Widget build(BuildContext context) { if (isDownloaded) { return refFileCard(context, urlPath: widget.urlPath, fileName: widget.fileName, page: widget.page, title: widget.title, cardTitle: widget.cardTitle, cardSubTitle: widget.cardSubTitle); } else { return refUrlCard(context, urlPath: widget.urlPath, fileName: widget.fileName, page: widget.page, title: widget.title, cardTitle: widget.cardTitle, cardSubTitle: widget.cardSubTitle); } } }
额外注意事项
在执行完下载PDF、删除本地PDF的操作后,需要主动调用一次checkFile()方法,即可立即刷新卡片状态,同步更新UI展示。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

