Следует отметить, что я новичок в Flutter и Stackoverflow.
В своем приложении для чтения новостей я добавил боковой ящик, который извлекает категории новостей из API с помощью FutureBuilder. Существует DrawerHeader
, который содержит категорию с названием Popular News, которая не извлекается из API, то есть stati c.
Каждый раз, когда я открываю API, категория «Популярные новости» отображается и работает нормально, но другие категории не отображаются, а в консоли отображаются ошибки, как показано ниже.
I/flutter ( 4486): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 4486): The following assertion was thrown during performResize():
I/flutter ( 4486): Vertical viewport was given unbounded height.
I/flutter ( 4486): Viewports expand in the scrolling direction to fill their container.In this case, a vertical
I/flutter ( 4486): viewport was given an unlimited amount of vertical space in which to expand. This situation
I/flutter ( 4486): typically happens when a scrollable widget is nested inside another scrollable widget.
I/flutter ( 4486): If this widget is always nested in a scrollable widget there is no need to use a viewport because
I/flutter ( 4486): there will always be enough vertical space for the children. In this case, consider using a Column
I/flutter ( 4486): instead. Otherwise, consider using the "shrinkWrap" property (or a ShrinkWrappingViewport) to size
I/flutter ( 4486): the height of the viewport to the sum of the heights of its children.
Мои коды приведены ниже
Виджет, который возвращает Drawer
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
return SizedBox(
width: SizeConfig.safeBlockHorizontal*50,
child: Theme(
data: Theme.of(context).copyWith(canvasColor: const Color(0xFF2b4849)),
child: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: ListTile(
title: Text(
"Popular News",
style: TextStyle(
color: Colors.white,
fontSize: 25
),
),
onTap: (){
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => MostPopularNewsfeed(),
)
);
},
),
),
FutureBuilder(
future: category,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if(snapshot.data == null) {
return Container(
child: Center(
child: Text(
"Loading",
style: TextStyle(
color: Colors.white
),
),
),
);
} else {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return _getDrawer(snapshot, index);
},
);
}
},
),
],
),
),
),
);
}
initState () : Этот category
является Future<List>
void initState() {
super.initState();
setState(() {
category = fetchCategory();
});
}
fetchCategory () : эта функция выбирает категории из API.
Future<List<Category>> fetchCategory() async {
//try {
String url = "https://tbsnews.net/json/category/news/list";
dio.interceptors.add(DioCacheManager(CacheConfig(baseUrl: url)).interceptor);
Response response = await Dio().get(url);
print(response);
List<Category> categoryList = [];
final Future<Database> dbFuture = categoryDatabaseHelper.initDb();
if(response.statusCode == 200) {
var decode = response.data;
print(decode);
for (var c in decode) {
Category category = Category(c['tid'], c['name']);
await categoryDatabaseHelper.insertCategory(category);
categoryList.add(category);
}
return categoryList;
//categoryDatabaseHelper.insertCategory(categoryList);
} else {
throw Exception("Failed to fetch category");
}
}
Что я пробовал до сих пор
Я попытался поместить DrawerHeader
и FutureBuilder
в виджет Expanded
вместо ListView
. Не работает.
В ListView я добавил shrinkWrap: true
, а также scrollDirection: Axis.vertical
. Это также бесполезно.
Пытался поместить их также в виджеты SizeBox
и Column
. Это тоже не сработало.
Вышесказанное я нашел, выполнив поиск по предыдущим вопросам, связанным с этой проблемой, в StackOverflow. Наконец, я отправляю вопрос сам.
Следует отметить, что когда я убираю это DrawerHeader
, все начинает работать нормально, больше никаких проблем. Но это должно быть DrawerHeader
.
Большое спасибо за ваше время и искреннюю помощь.