#flutter #listview
#flutter #listview
Вопрос:
Ребята, я столкнулся с большой проблемой.. не уверен, что это происходит, но моя функция для возврата списка с отфильтрованными записями работает правильно.. но все же мой Listview.builder показывает неправильные элементы .. т. е. предположим, что я ищу ключевое слово из моего списка, в котором есть 2 записи.. тогда результат функции фильтра верен.. но на экране Listview Builder показывает верхние 2 элемента из исходного списка. не получается y, это происходит
class DashboardScreenState extends State<DashboardScreen> {
final ScrollController _scrollController = ScrollController();
TextEditingController controller = new TextEditingController();
List<TaskDetails> taskDetailsList = [];
List<TaskDetails> fullTaskDetailsList = [];
@override
void initState() {
super.initState();
taskDetailsList = BlocProvider.of<AppmgrBloc>(context).state.taskDetails;
if(taskDetailsList.length == 0) {
InitializerService _initService = InitializerService.instance;
taskDetailsList = _initService.allTaskList;
}
taskDetailsList = taskDetailsList.where((TaskDetails td) {
if(td.progressStatus == 'COMPLETE' || td.progressStatus == 'DELETE') {
return false;
}
return true;
}).toList();
taskDetailsList.sort((td1, td2) => td1.taskBookDate.compareTo(td2.taskBookDate));
print('Init State Size ' taskDetailsList.length.toString());
fullTaskDetailsList.addAll(taskDetailsList);
}
@override
Widget build(BuildContext context) {
print('Build Widget state');
return Scaffold(
backgroundColor: Colors.grey[200],
body: SingleChildScrollView(
child: Column(
children: [
getHeaderSearch(),
/* generateListWithTiles(taskDetailsList), */
/* taskDetailsList.length != 0 || */
controller.text.isNotEmpty
? generateListWithTiles(taskDetailsList)
: generateListWithTiles(fullTaskDetailsList)
]),
),
);
}
Widget getHeaderSearch() {
return Container(
color: AppLevelConstants.BASE_BLUE_COLOR,
padding: EdgeInsets.all(5),
child: Column(
children: [
TaskSearchCustomWidget(
controller: controller,
onTextChanged: (textVal) {
this.searchMethodWithTest(textVal);
},
),
SizedBox(height: 2,),
Text('** Press amp; Hold to Edit All fields..', style: TextStyle(fontSize: 7, color: Colors.white, ),)
],
),
);
}
searchMethodWithTest(String text) {
taskDetailsList.clear();
text = text.toLowerCase();
if (text.isEmpty) {
taskDetailsList.addAll(fullTaskDetailsList);
setState(() {});
return;
}
fullTaskDetailsList.forEach((taskdetails) {
String title = taskdetails.title;
if (title.toLowerCase().contains(text)) {
taskDetailsList.add(taskdetails);
}
});
setState(() {});
}
ListView generateListWithTiles(List<TaskDetails> tasks) {
print('===============================================');
print(tasks.toString()); /* Filtered list is correct here */
print('===============================================');
return ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
controller: _scrollController,
padding: EdgeInsets.all(5),
itemCount: tasks.length,
itemBuilder: (context, index) {
return Card(
child: DashboardTaskTile(tasks[index]),
);
},
);
}
}
Ответ №1:
Вот пример приложения:
Метод поиска:
void searchMethodWithTest(String text) {
List result = [];
print("Text: " text.length.toString());
if (mycontroller.text.isNotEmpty) {
fullTaskDetailsList.forEach((element) {
text = text.trim();
if (element.toLowerCase().contains(text)) {
result.add(element);
}
});
print(taskDetailsList.toString());
setState(() {
taskDetailsList = resu<
});
return;
} else {
setState(() {
taskDetailsList = fullTaskDetailsList;
});
return;
}
}
Полный рабочий пример кода:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List fullTaskDetailsList = [];
List taskDetailsList = [];
TextEditingController mycontroller = TextEditingController();
void searchMethodWithTest(String text) {
List result = [];
print("Text: " text.length.toString());
if (mycontroller.text.isNotEmpty) {
fullTaskDetailsList.forEach((element) {
text = text.trim();
if (element.toLowerCase().contains(text)) {
result.add(element);
}
});
print(taskDetailsList.toString());
setState(() {
taskDetailsList = resu<
});
return;
} else {
setState(() {
taskDetailsList = fullTaskDetailsList;
});
return;
}
}
@override
void initState() {
fullTaskDetailsList = countryList;
taskDetailsList = fullTaskDetailsList;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Center(
child: Column(
children: [
TextField(
controller: mycontroller,
onChanged: (value) {
searchMethodWithTest(mycontroller.text.toLowerCase());
},
decoration: InputDecoration(
contentPadding: EdgeInsets.all(10),
hintText: "Search For Countries",
),
),
Text("Searched for: ${mycontroller.text}"),
Container(
width: double.infinity,
height: 400.0,
child: ListView.builder(
itemCount: taskDetailsList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(
taskDetailsList[index],
style: TextStyle(
fontSize: 20.0,
),
),
);
}),
)
],
),
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
const countryList = [
"Afghanistan",
"Albania",
"Algeria",
"American Samoa",
"Andorra",
"Angola",
"Anguilla",
"Antarctica",
"Antigua and Barbuda",
"Argentina",
"Armenia",
"Aruba",
"Australia",
"Austria",
"Azerbaijan",
"Bahamas (the)",
"Bahrain",
"Bangladesh",
"Barbados",
"Belarus",
"Belgium",
"Belize",
"Benin",
"Bermuda",
"Bhutan",
"Bolivia (Plurinational State of)",
"Bonaire, Sint Eustatius and Saba",
"Bosnia and Herzegovina",
"Botswana",
"Bouvet Island",
"Brazil",
"British Indian Ocean Territory (the)",
"Brunei Darussalam",
"Bulgaria",
"Burkina Faso",
"Burundi",
"Cabo Verde",
"Cambodia",
"Cameroon",
"Canada",
"Cayman Islands (the)",
"Central African Republic (the)",
"Chad",
"Chile",
"China",
"Christmas Island",
"Cocos (Keeling) Islands (the)",
"Colombia",
"Comoros (the)",
"Congo (the Democratic Republic of the)",
"Congo (the)",
"Cook Islands (the)",
"Costa Rica",
"Croatia",
"Cuba",
"Curaçao",
"Cyprus",
"Czechia",
"Côte d'Ivoire",
"Denmark",
"Djibouti",
"Dominica",
"Dominican Republic (the)",
"Ecuador",
"Egypt",
"El Salvador",
"Equatorial Guinea",
"Eritrea",
"Estonia",
"Eswatini",
"Ethiopia",
"Falkland Islands (the) [Malvinas]",
"Faroe Islands (the)",
"Fiji",
"Finland",
"France",
"French Guiana",
"French Polynesia",
"French Southern Territories (the)",
"Gabon",
"Gambia (the)",
"Georgia",
"Germany",
"Ghana",
"Gibraltar",
"Greece",
"Greenland",
"Grenada",
"Guadeloupe",
"Guam",
"Guatemala",
"Guernsey",
"Guinea",
"Guinea-Bissau",
"Guyana",
"Haiti",
"Heard Island and McDonald Islands",
"Holy See (the)",
"Honduras",
"Hong Kong",
"Hungary",
"Iceland",
"India",
"Indonesia",
"Iran (Islamic Republic of)",
"Iraq",
"Ireland",
"Isle of Man",
"Israel",
"Italy",
"Jamaica",
"Japan",
"Jersey",
"Jordan",
"Kazakhstan",
"Kenya",
"Kiribati",
"Korea (the Democratic People's Republic of)",
"Korea (the Republic of)",
"Kuwait",
"Kyrgyzstan",
"Lao People's Democratic Republic (the)",
"Latvia",
"Lebanon",
"Lesotho",
"Liberia",
"Libya",
"Liechtenstein",
"Lithuania",
"Luxembourg",
"Macao",
"Madagascar",
"Malawi",
"Malaysia",
"Maldives",
"Mali",
"Malta",
"Marshall Islands (the)",
"Martinique",
"Mauritania",
"Mauritius",
"Mayotte",
"Mexico",
"Micronesia (Federated States of)",
"Moldova (the Republic of)",
"Monaco",
"Mongolia",
"Montenegro",
"Montserrat",
"Morocco",
"Mozambique",
"Myanmar",
"Namibia",
"Nauru",
"Nepal",
"Netherlands (the)",
"New Caledonia",
"New Zealand",
"Nicaragua",
"Niger (the)",
"Nigeria",
"Niue",
"Norfolk Island",
"Northern Mariana Islands (the)",
"Norway",
"Oman",
"Pakistan",
"Palau",
"Palestine, State of",
"Panama",
"Papua New Guinea",
"Paraguay",
"Peru",
"Philippines (the)",
"Pitcairn",
"Poland",
"Portugal",
"Puerto Rico",
"Qatar",
"Republic of North Macedonia",
"Romania",
"Russian Federation (the)",
"Rwanda",
"Réunion",
"Saint Barthélemy",
"Saint Helena, Ascension and Tristan da Cunha",
"Saint Kitts and Nevis",
"Saint Lucia",
"Saint Martin (French part)",
"Saint Pierre and Miquelon",
"Saint Vincent and the Grenadines",
"Samoa",
"San Marino",
"Sao Tome and Principe",
"Saudi Arabia",
"Senegal",
"Serbia",
"Seychelles",
"Sierra Leone",
"Singapore",
"Sint Maarten (Dutch part)",
"Slovakia",
"Slovenia",
"Solomon Islands",
"Somalia",
"South Africa",
"South Georgia and the South Sandwich Islands",
"South Sudan",
"Spain",
"Sri Lanka",
"Sudan (the)",
"Suriname",
"Svalbard and Jan Mayen",
"Sweden",
"Switzerland",
"Syrian Arab Republic",
"Taiwan",
"Tajikistan",
"Tanzania, United Republic of",
"Thailand",
"Timor-Leste",
"Togo",
"Tokelau",
"Tonga",
"Trinidad and Tobago",
"Tunisia",
"Turkey",
"Turkmenistan",
"Turks and Caicos Islands (the)",
"Tuvalu",
"Uganda",
"Ukraine",
"United Arab Emirates (the)",
"United Kingdom of Great Britain and Northern Ireland (the)",
"United States Minor Outlying Islands (the)",
"United States of America (the)",
"Uruguay",
"Uzbekistan",
"Vanuatu",
"Venezuela (Bolivarian Republic of)",
"Viet Nam",
"Virgin Islands (British)",
"Virgin Islands (U.S.)",
"Wallis and Futuna",
"Western Sahara",
"Yemen",
"Zambia",
"Zimbabwe",
"Åland Islands"
];
Комментарии:
1. Извините, брат, результаты не фильтруются
2. ваш ответ правильный, поскольку я вижу, что мои элементы правильно фильтруются, но сейчас большая проблема заключается в том, что .. в Listview.builder, когда я использую плитку расширения с отслеживанием состояния, которая вызывает у меня проблемы .. т.е. она всегда показывает первый элемент списка.
3. Да, вы можете попробовать добавить плитку расширения виджета с отслеживанием состояния и использовать логику фильтра, описанную выше.. с помощью виджета с отслеживанием состояния он также всегда терпит неудачу .. т.е. Если вы ищете 3-й элемент, он покажет вам только 1-й элемент вашего списка.