флаттер, как расширить контейнер с результатом поиска по текстовому полю
Я пытался сделать раскрывающийся список, похожий на пользовательскую страницу результатов поиска, но это не удалось с некоторыми ошибками, например, дети RenderFlex имеют ненулевой изгиб, но входящие ограничения высоты не ограничены. Есть ли способ решить без пакета?? когда я удаляю один дочерний вид прокрутки, все, кроме прокрутки, работает, но есть ли способ реализовать прокрутку?
Страница списка
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class ListPage extends StatefulWidget {
@override
_ListPageState createState() => _ListPageState();
}
class _ListPageState extends State<ListPage> {
List<Map<String, String>> studentList = [
{"John Honai": "Tokio"},
{"John Wick": "Cuba"}
];
bool showList = false;
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: [
SizedBox(
height: 20,
),
Container(
height: 50,
child: Text("container1 height 50"),color: Colors.lightBlue,
),
SizedBox(
height: 20,
),
Container(
height: 50,
child: Text("container2 height 50"),color: Colors.orangeAccent,
),
SizedBox(
height: 20,
),
ButtonSearchExpanded(
onChangedText: (_) {
setState(() {
showList = true;
});
},
showList: showList,
studentList: studentList,
),
SizedBox(
height: 20,
),
Container(
height: 50,
child: Text("container3 height 50"),color: Colors.white54,
),
SizedBox(
height: 20,
),
Container(
height: 50,
child: Text("container4 height 50"),color: Colors.cyanAccent,
),
],
),
),
);
}
}
Текстовое поле Widgetpage при измененном ответе, переданном на страницу списка, и переданное обратно, показывает studentList как true, что показывает представление списка.
import 'package:flutter/material.dart';
class ButtonSearchExpanded extends StatelessWidget {
final List<Map<String, String>> studentList;
final bool showList;
final Function onChangedText;
ButtonSearchExpanded(
{
this.onChangedText,this.studentList,this.showList});
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
child: Column(
children: [
Container(
height: 60,
child: Row(
children: [Expanded(child:
TextField(onChanged: onChangedText,)), Text("some other content"),
],
),
),showList?Expanded(child: ListView.builder(itemCount:studentList.length,itemBuilder: (context,index){
return ListTile(title: Text(studentList[index].keys.first),trailing: Text(studentList[index].values.first),);
})):Container()
],
),
));
}
}
2 ответа
Вы пробовали, добавив эту строку, shrinkWrap: true, ?
ListView.builder(
shrinkwrap:true, // add this line
itemBuilder: (context,index){
return
до моего исследования невозможно, чтобы столбец-> расширенный-> listviewbuilder взаимно противоречил друг другу, потому что столбец сжимает его дочерний элемент, а расширенный расширяет дочерний элемент, поэтому я изменил его на гибкий со свойством flexfit.loose и свойством столбца Размер основной оси min, следовательно, это решило проблему. я получил этот ответ от Как использовать Expanded в SingleChildScrollView?
final List<Map<String, String>> studentList;
final bool showList;
final Function onChangedText;
ButtonSearchExpanded(
{
this.onChangedText,this.studentList,this.showList});
@override
Widget build(BuildContext context) {
return Column(mainAxisSize: MainAxisSize.min,
children: [
Container(
height: 60,
child: Row(
children: [
Expanded(child: TextField(onChanged: onChangedText,)), Text("some other content"),
],
),
),showList?Flexible(fit: FlexFit.loose,child: ListView.builder(shrinkWrap: true,itemCount: studentList.length,itemBuilder: (context,index){
return ListTile(title: Text(studentList[index].keys.first),trailing: Text(studentList[index].values.first),);
})):Container()
],
);
}
}