Flutter开发:SliverList为空时如何展示提示消息?
解决SliverList筛选后无数据显示提示的问题
核心修改点
- 判断筛选结果是否为空:当
allUsers长度为0时,用SliverFillRemaining展示提示文本,否则渲染用户列表 - 监听搜索输入触发UI刷新:给
TextField添加输入回调,确保筛选条件变化后页面能重新构建
修改后的完整代码
Widget build(BuildContext context) { return Scaffold( body: BlocBuilder<UsersCubit, UsersState>(builder: (context, userState) { if (userState is UsersLoaded) { List<UserEntity> allUsers = userState.users .where((user) => user.name!.toLowerCase().contains(_searchController.text.toLowerCase())) .toList(); return CustomScrollView( slivers: <Widget>[ SliverAppBar( floating: true, snap: true, automaticallyImplyLeading: false, elevation: 0, title: TextField( controller: _searchController, onChanged: (value) { // 触发UI重新构建,若需通过Cubit处理搜索逻辑,可替换为对应Cubit方法调用 setState(() {}); }, style: Theme.of(context).textTheme.bodyText1, decoration: InputDecoration( hintText: 'Search ...', ), ), ), // 根据筛选结果切换显示内容 if (allUsers.isEmpty) SliverFillRemaining( child: Center( child: Text('没有找到匹配的用户'), ), ) else SliverList( delegate: SliverChildBuilderDelegate( (BuildContext context, int index) { return User( otherUser: allUsers[index], ); }, childCount: allUsers.length, ), ), ], ); } else { return const Scaffold( body: Center(child: CircularProgressIndicator())); } }), ); }
额外说明
- 修正了原代码中
where条件的语法错误(原代码缺少>符号) - 如果业务逻辑需要通过Cubit从服务端获取筛选数据,可将
setState替换为Cubit的搜索方法调用,比如context.read<UsersCubit>().searchUsers(value) SliverFillRemaining会自动填充CustomScrollView的剩余空间,确保提示文本居中显示
内容的提问来源于stack exchange,提问作者Mus
相关产品推荐
相关产品推荐

