Flutter将列表索引传入Stateful Widget加载PDF时遇索引未识别问题
问题分析与解决办法
嘿,我一眼就发现问题所在啦!你在State类_MyDetailsPage里直接用index是行不通的——因为这个index是定义在父类DetailsPage(也就是你的StatefulWidget)里的成员变量,State类想要访问它,必须通过widget.index这个方式才行。
具体修改步骤:
- 在
loadDocument方法里,把locations[index].Booklink改成locations[widget.index].Booklink,这样就能正确获取到传递过来的索引值了。
修改后的关键代码片段:
loadDocument() async { document = await PDFDocument.fromURL(locations[widget.index].Booklink); setState(() => _isLoading = false); }
额外小建议:
你可以把locations这个列表移到DetailsPage类外面(作为全局常量),或者定义成static变量,这样就不用每次创建_MyDetailsPage实例都重新初始化一遍这个列表啦,比如:
// 把列表移到类外面 List locations = [ Books( name: 'book name 1', Booklink: 'https://storage.googleapis.com/school_books/Class9/ban/Bangla%20Sahitto.pdf'), Books( name: 'book name 2', Booklink: 'https://storage.googleapis.com/school_books/Class9/ban/Bangla%20Sahitto.pdf') ]; class DetailsPage extends Stateful Widget { final int index; DetailsPage(this.index); @override _MyDetailsPage createState() => _MyDetailsPage(); } class _MyDetailsPage extends State<DetailsPage> { bool _isLoading = true; PDFDocument document; @override void initState() { super.initState(); loadDocument(); } loadDocument() async { document = await PDFDocument.fromURL(locations[widget.index].Booklink); setState(() => _isLoading = false); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(), body: Center( child: _isLoading ? Center(child: CircularProgressIndicator()) : PDFViewer( document: document, zoomSteps: 1, ), ), ), ); } }
为什么会出现这个问题?
Flutter的StatefulWidget和它对应的State是两个独立的类,State类通过widget属性持有对应的StatefulWidget实例的引用,所以必须通过widget.成员变量名的方式才能访问到StatefulWidget里定义的变量,直接写变量名是找不到的哦。
内容的提问来源于stack exchange,提问作者Rifat Hossain
相关产品推荐
相关产品推荐

