Flutter中如何传递TextEditingController变量至其他类及同类填充ListTile方案咨询
解决方案2:在_ActivitiesParticipantsState内部直接填充ListTile
如果你不想单独维护InterestedName组件,可以把文档数据获取逻辑直接整合到ListView.builder的itemBuilder中:
Expanded( child: ListView.builder( itemCount: docIDs.length, itemBuilder: (context, index) { final collectionName = activityController.text.trim(); if (collectionName.isEmpty) { return const ListTile(title: Text('Please enter a collection name')); } return Padding( padding: const EdgeInsets.symmetric(vertical: 15), child: ListTile( dense: true, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), tileColor: const Color.fromARGB(255, 235, 235, 235), title: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20), child: FutureBuilder<DocumentSnapshot>( future: FirebaseFirestore.instance .collection(collectionName) .doc(docIDs[index]) .get(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (!snapshot.hasData || !snapshot.data!.exists) { return const Text('Document not found'); } Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; return Column( children: [ const SizedBox(height: 5), Align( alignment: Alignment.centerLeft, child: Text( 'Name: ${data['name']}', style: const TextStyle( fontSize: 16, fontFamily: 'Quicksand', fontWeight: FontWeight.w600), ), ), const SizedBox(height: 20), ], ); } return const Text('loading...'); }, ), ), ), ); }, ), )
这种方式省去了单独的组件,所有逻辑都集中在当前State类中,适合简单的UI场景。
额外注意事项
- 建议在用户输入集合名称时做基本校验(比如非空、避免特殊字符),防止无效的Firestore请求。
- 如果文档数量较多,单个
FutureBuilder的性能可能不足,可以考虑用Future.wait批量获取文档,或者改用StreamBuilder实时监听数据变化。 - 原代码中
FutureBuilder没有指定future参数,会导致每次build时重复发起请求,上面的两种方案都已经修正了这个问题。
内容的提问来源于stack exchange,提问作者pika3113
相关产品推荐
相关产品推荐

