У меня возникли проблемы с отображением результатов с помощью виджета ListView.Builder. Когда я разместил его на странице main.dart, что бы я ни делал, страница постоянно выдавала ошибки рендеринга. Сразу же вынес на отдельную страницу, отображалось корректно без ошибок. Страница (main.dart) отображается без каких-либо ошибок без listView.builder. Мой вопрос: возможно ли или иначе отображать ListView.Builder вместе с другими виджетами на одной странице или он должен отображаться на отдельной странице? Любая помощь будет оценена.
body: TabBarView(
children: <Widget>[
SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
// child: SingleChildScrollView(
// scrollDirection: Axis.vertical,
child:Container(
child: Column(
//crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
child:Expanded(
child: Image.asset("assets/images/1frenchToast.webp"),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text("Select Cuisine",style: TextStyle(color: Colors.black),),
GestureDetector(
child: DropdownButton(
//isDense: true,
style: TextStyle(fontSize: 14,color: Colors.black,),
value: dropDownSelectedItemState,
items: items,
onChanged: (String selectValue){
ClassHub().mySharedPreference("cuisineChoice", "set", selectValue);
ClassHub().getFoodCategory(selectValue).then((onValue){
if (onValue !=null){
setState(() {
foodCategory = onValue;
});
}
});
setState(() {
dropDownSelectedItemState = selectValue;
});
},
),
onLongPress: (){
},
),
],
),
// This is the portion causing issues
Column(
//mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
//myListView(),
Container(
child: ListView.builder(scrollDirection: Axis.vertical,
itemCount: foodCategory.length
itemBuilder: (context,index){
return ListTile(
title: Text(foodCategory[index].foodType),
);
},
),
),
]
),
Container(
//height: 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
margin: EdgeInsets.only(top: 20,),
height: 60,
width: MediaQuery.of(context).size.width-20,
child: ListTile(
leading: CircleAvatar(
minRadius: 10,
maxRadius: 30,
//child:Image.asset("assets/images/Capture.JPG",height: 60,width: 60,),
//borderRadius: BorderRadius.circular(30),
backgroundImage: ExactAssetImage('assets/images/Capture.JPG'),
),
title: Text("Western Food Recipes"),
),
),
],
),
Container(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
height: 60,
width: MediaQuery.of(context).size.width-20,
child:ListTile(
leading: Image.asset("assets/images/Capture.JPG"),
// borderRadius: BorderRadius.circular(30),
// ),
title: Text("African Food Recipes"),
),
),
],
),
Container(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
height: 60,
width: MediaQuery.of(context).size.width-20,
child:ListTile(
leading: Image.asset("assets/images/Capture.JPG"),
// borderRadius: BorderRadius.circular(30),
// ),
title: Text("African Food Recipes"),
),
),
],
),
],
),
),
// ),
),
],
),
),
Я хочу иметь возможность отображать виджет ListView.Builder на одной странице с другими виджетами без каких-либо ошибок рендеринга. Это возможно или нет?
Что вам нужно, так это shrinkWrap = true внутри ListView.builder.
В противном случае дети не будут знать, сколько места занимает прокручиваемый виджет.
BouncingScrollPhysics() не работает с shrinkWrap = true. Любой обходной путь для этого?
@ Видор Вистром, спасибо за полезный ответ. shrinkwrap: верно, ListView.builder отображается корректно, но, пожалуйста, еще кое-что. Содержимое списка не прокручивается, а прокручивается вся страница. Существует SingleChildScrollView для страницы и еще один для ListView.builder. Как я могу сделать так, чтобы содержимое Listview.builder также прокручивалось. И можно ли разместить на странице несколько одиночных прокруток. Еще раз спасибо.
@defemz попробуйте добавить физику в список как AlwaysScrollablePhysics()
@VidorVistrom еще раз спасибо. добавление физики в ListView как AlwaysScrollablePhysics() не имеет никакого эффекта.
@defemz Понятно .. это потому, что все ваши элементы надуты в пространстве и принимают соответствующую высоту. Нет смысла прокручивать их отдельно тогда. Что вы можете сделать, так это обернуть список в контейнер и присвоить этому контейнеру фиксированную высоту. И отдых такой же. У вас будет список, превышающий высоту контейнера, поэтому будет задействована прокрутка.
@VidorVistrom Вау, спасибо, приятель, твой последний ответ полностью решил мои проблемы.
вы должны пройти builder_context и использовать эту функцию ListView.Builder, это может вам помочь
это виджет, его не нужно перемещать на другую страницу.