#flutter #dart #flutter-layout
Вопрос:
В одном из моих файлов Flutter у меня есть этот код, который теоретически, по-видимому, вообще не должен быть проблемой для запуска. Он хорошо отображается в отладочной версии, но когда я создаю файлы приложений для iOS и Android, он становится частично невидимым. Есть виджет, который отображается под названием _heyName()
, который является просто текстовым виджетом. _whatWouldYouLike()
Виджет в значительной степени является копией 1:1 _heyName()
, но этот не визуализируется, как и любой другой виджет впоследствии.
Однако консоль выдает это предупреждение:
======== Exception caught by widgets library =======================================================
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.
The ParentDataWidget Flexible(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject, which has been set up to accept ParentData of incompatible type ParentData.
Usually, this means that the Flexible widget has the wrong ancestor RenderObjectWidget. Typically, Flexible widgets are placed directly inside Flex widgets.
The offending Flexible is currently placed inside a RepaintBoundary widget.
The ownership chain for the RenderObject that received the incompatible parent data was:
ConstrainedBox ← Container ← Flexible ← RepaintBoundary ← IndexedSemantics ← NotificationListener<KeepAliveNotification> ← KeepAlive ← AutomaticKeepAlive ← KeyedSubtree ← SliverList ← ⋯
When the exception was thrown, this was the stack:
#0 RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:5723:11)
#1 RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:5739:6)
#2 RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:5761:7)
#3 RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5440:5)
#4 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6082:11)
...
====================================================================================================
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
backgroundColor: Colors.transparent,
shadowColor: Colors.transparent,
pinned: false,
expandedHeight: appBarHeight,
automaticallyImplyLeading: false,
floating: true,
flexibleSpace: LayoutBuilder(
builder: (context, constraints) {
return Container(
alignment: Alignment.bottomCenter,
child: Container(
height: SizeConfig.screenWidth * 0.13,
child: GestureDetector(
onTap: () {
},
child: _searchCategories(context))),
);
},
),
),
];
},
body: ListView(
shrinkWrap: true,
children: [
_heyName(),
SizedBox(
height: 10,
),
_whatWouldYouLike(),
SizedBox(
height: 10,
),
_requests(),
SizedBox(
height: 10,
),
Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_categoriesText(),
_seeAll(),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_category("Food and Beverages", 1),
_category("Design", 2),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.1,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_category("Music", 3),
_category("Sports and Fitness", 4),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.1,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_category("Personal Grooming", 5),
_category("Information Technology", 6),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.1,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_category("Home Services", 7),
_category("Lifestyle", 8),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.1,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_category("Pet Services", 9),
_category("Consulting", 10),
],
),
SizedBox(
height: SizeConfig.screenWidth * 0.25,
),
],
),
],
),
),
);
}
}
Есть ли какой-либо другой виджет, который я мог бы использовать вместо ListView здесь? Я чувствую, что это источник проблемы, так как, когда я использую столбец вместо ListView, он отображается нормально, просто потому, что он больше экрана, он выдает старую добрую ошибку RenderFlex. Я попытался развернуть колонку, но безуспешно. Я чувствую, что мне здесь чего-то не хватает.
Ответ №1:
Вероятно, это вызвано одним из ваших пользовательских виджетов, таких как _heyName()
или _whatWouldYouLike()
. Поделитесь кодом для этих виджетов или лучше посмотрите код, который вы написали, и убедитесь, что они не начинаются с Flexible
виджета.
Ошибка понятна сама по себе, вы используете Flexible
виджет внутри чего-то, кроме Row
или Column
. Таким образом, в вашем представлении списка дети начинаются с гибкого, и, таким образом, вы получаете эту ошибку. То же самое касается расширенного, например, вы не можете поместить расширенное в контейнер или представление списка.
Комментарии:
1. Это был один гибкий внутри виджета _whatWouldYouLike (), о котором я упоминал. Удаление, которое решило все это. Спасибо!