Flutter 颤振:Listview在搜索时未更新
一切正常,但ListView不会在onChanged上更新。虽然我使用的是setstate,但它仍然没有过滤数据。注意(列表在打印时正在被过滤。唯一的问题是屏幕没有更新)Flutter 颤振:Listview在搜索时未更新,flutter,listview,dart,search,Flutter,Listview,Dart,Search,一切正常,但ListView不会在onChanged上更新。虽然我使用的是setstate,但它仍然没有过滤数据。注意(列表在打印时正在被过滤。唯一的问题是屏幕没有更新) 导入“包装:颤振/材料.省道”; 导入“包:provider/provider.dart”; 导入“套餐:一起旅行”乘客/车型/用户.dart; 导入“套餐:一起旅行\u乘客/屏幕/用户\u可用\u拼车\u瓷砖.dart”; 类用户可用Corpools列表扩展StatefulWidget{ @凌驾 _用户\u Availabl
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“套餐:一起旅行”乘客/车型/用户.dart;
导入“套餐:一起旅行\u乘客/屏幕/用户\u可用\u拼车\u瓷砖.dart”;
类用户可用Corpools列表扩展StatefulWidget{
@凌驾
_用户\u AvailableCarools\u LISTState createState()=>
_用户可用的客户端列表状态();
}
类(用户)(可用工具)(列表状态)
扩展状态{
@凌驾
小部件构建(构建上下文){
最终检查拼车=提供商(上下文)??[];
最终可用成本=
选中拼车。其中((元素)=>element.seats>0)。toList()??[];
列出FilteredCarpool=
选中拼车。其中((元素)=>element.seats>0)。toList()??[];
返回脚手架(
正文:专栏(
儿童:[
扩大(
孩子:TextField(
装饰:输入装饰(hintText:“搜索…”),
一旦更改:(文本){
设置状态(){
filteredcarpools=可用的Carpools
.其中((元素)=>element.pickupaddress
.toLowerCase()
.contains(text.toLowerCase())
.toList();
});
},
)),
扩大(
弹性:10,
子项:ListView.builder(
itemCount:filteredcarpools.length,
itemBuilder:(上下文,索引){
返回用户可用的Corpools(filteredcarpools[索引]);
},
),
),
],
),
);
}
}
以下代码正在运行。非常感谢pskink给了我这个提示
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:travel_together_passenger/Models/user.dart';
import 'package:travel_together_passenger/Screens/User_Available_Carpools_TILE.dart';
class User_AvailableCarpools_LIST extends StatefulWidget {
@override
_User_AvailableCarpools_LISTState createState() => _User_AvailableCarpools_LISTState();
}
class _User_AvailableCarpools_LISTState extends State<User_AvailableCarpools_LIST> {
String txt = '';
@override
Widget build(BuildContext context) {
final checkcarpools = Provider.of<List<CarpoolDataShow>>(context) ?? [];
final availablecarpools =
checkcarpools.where((element) => element.seats > 0).toList() ?? [];
List filteredcarpools =
availablecarpools.where((element) => element.pickupaddress.toLowerCase().contains(txt.toLowerCase())).toList() ?? [];
return Scaffold(
body: Column(
children: [
Expanded(
child: TextField(
decoration: InputDecoration(
hintText: 'search..'
),
onChanged: (text)
{
setState(() {
txt=text;
});
print(filteredcarpools);
},
),
),
Expanded(
flex: 10,
child: ListView.builder(
//shrinkWrap: true,
key: UniqueKey(),
itemCount: filteredcarpools.length,
itemBuilder: (context, index) {
// print(filteredcarpools);
return User_AvailableCarpools_TILE(filteredcarpools[index]);
},
),
),
],
),
);
}
}
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“套餐:一起旅行”乘客/车型/用户.dart;
导入“套餐:一起旅行\u乘客/屏幕/用户\u可用\u拼车\u瓷砖.dart”;
类用户可用Corpools列表扩展StatefulWidget{
@凌驾
_用户\u AvailableCarools\u LISTState createState()=>\u用户\u AvailableCarools\u LISTState();
}
类(用户)(可用工具)列表状态(扩展状态){
字符串txt='';
@凌驾
小部件构建(构建上下文){
最终检查拼车=提供商(上下文)??[];
最终可用成本=
选中拼车。其中((元素)=>element.seats>0)。toList()??[];
列出FilteredCarpool=
AvailableCarools.where((element)=>element.pickupaddress.toLowerCase().contains(txt.toLowerCase()).toList()??[];
返回脚手架(
正文:专栏(
儿童:[
扩大(
孩子:TextField(
装饰:输入装饰(
hintText:“搜索…”
),
一旦更改:(文本)
{
设置状态(){
txt=文本;
});
打印(filteredcarpools);
},
),
),
扩大(
弹性:10,
子项:ListView.builder(
//收缩膜:对,
键:UniqueKey(),
itemCount:filteredcarpools.length,
itemBuilder:(上下文,索引){
//打印(filteredcarpools);
返回用户可用的Corpools(filteredcarpools[索引]);
},
),
),
],
),
);
}
}
Provider.of(context.method()?方法调用丢失您的意思是在调用setState()
内部onChanged
回调后没有调用build
方法吗?是的,在setState()之后没有调用它我假设您添加了两个print
s:一个在setState
内,第二个在build
内,您只看到第一个?如果你在flifter中发现了一个严重的bug,那么我想不,问题是使用SetState时,我的屏幕没有使用过滤列表进行更新。简单地说,listviewbuilder不会使用SetState刷新更新后的列表
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:travel_together_passenger/Models/user.dart';
import 'package:travel_together_passenger/Screens/User_Available_Carpools_TILE.dart';
class User_AvailableCarpools_LIST extends StatefulWidget {
@override
_User_AvailableCarpools_LISTState createState() => _User_AvailableCarpools_LISTState();
}
class _User_AvailableCarpools_LISTState extends State<User_AvailableCarpools_LIST> {
String txt = '';
@override
Widget build(BuildContext context) {
final checkcarpools = Provider.of<List<CarpoolDataShow>>(context) ?? [];
final availablecarpools =
checkcarpools.where((element) => element.seats > 0).toList() ?? [];
List filteredcarpools =
availablecarpools.where((element) => element.pickupaddress.toLowerCase().contains(txt.toLowerCase())).toList() ?? [];
return Scaffold(
body: Column(
children: [
Expanded(
child: TextField(
decoration: InputDecoration(
hintText: 'search..'
),
onChanged: (text)
{
setState(() {
txt=text;
});
print(filteredcarpools);
},
),
),
Expanded(
flex: 10,
child: ListView.builder(
//shrinkWrap: true,
key: UniqueKey(),
itemCount: filteredcarpools.length,
itemBuilder: (context, index) {
// print(filteredcarpools);
return User_AvailableCarpools_TILE(filteredcarpools[index]);
},
),
),
],
),
);
}
}