我的布局是一個帶有一些控制元件的Form widget:
Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start。
兒童。[
表格(
key: widget.addEventFormKey,
onChanged: () {},
孩子。擴展的(
孩子。SingleChildScrollView(
child: 列(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
兒童。[
Text(CustomResources.strings["add_event_category_label"], style: TextStyle(fontWeight: FontWeight.bold))。
/*其他一些小工具*/。
可見性(
孩子。容器(
高度。200.0。
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: _attachments?.length,
itemBuilder: (context, index) {
return Stack(
兒童。[
容器(
margin: EdgeInsets.fromLTRB(0, 0, 5, 0)。
孩子。堆疊(
children: [
ClipRect(
child: Image.file(File(_attachments[index]), cacheWidth: 200) 。
borderRadius: borderRadius.round(8.0)。
),
],
),
),
IconButton(
onPressed: () {
File(_attachments[index]).delete()。
setState(() => _attachments.remove(_attachments[index]) )。
},
圖示。Icon(FontAwesomeIcons.trash, color: Colors.white, size: 20)。)
padding: EdgeInsets.only(top: 4, left: 4)。)
限制條件。BoxConstraints()。
),
],
);
},
),
),
可見。_attachments.length > 0,
),
Visibility(child: Padding(padding: EdgeInsets.fromLTRB(0, 18, 0, 0),visible: _attachments.length > 0)。
大小盒(SizedBox)
孩子。RaisedButton(
形狀。RoundedRectangleBorder(borderRadius: borderRadius.round(24.0))。
onPressed: _attachments.length < 3 ? () => _pickImage() : null,
padding: EdgeInsets.all(12.0)。
color: Colors.blue,
孩子。Text(CustomResources.strings["add_event_add_photo_button_label"], style: TextStyle(color: Colors.white))。
width: double.infinity,
),
],
),
),
),
),
],
);
問題部分是ListView.builder顯示水平滾動的圖片串列。正如你所看到的,圖片將總是得到固定的寬度(200)和未知的高度,因為高度取決于圖片的長寬比。ListView.builder被Container包裹,所以現在它的高度是固定的200。
我想強制我的ListView.builder擴展到兒童影像的高度(它是水平滾動的單行ListView),影像的寬度總是200,其他部件應該被放置在它的下面,沒有任何剩余空間。在目前的方法中,如果影像的高度是<200,影像串列下面就會有剩余的空間。如果圖片的高度是>200,圖片將被縮放(寬度/高度)。
我試著用Expanded widget代替Container來包裝串列視圖,但是它拋出了例外:
RenderFlex的孩子有非零的靈活性,但傳入的高度約束 是無界的。
它說我仍然需要提供高度,而我并不希望這樣做。如何解決這個問題?
uj5u.com熱心網友回復:
如果你得到RenderFlex的孩子有非零的flex,但傳入的高度約束是無界的。試試下面的代碼,希望對你有幫助。在Expanded()Widget里面添加你的Column,并在你的代碼中洗掉SingleChildScrollView()。
Expanded(
孩子。Column(
children:[
//Your Widgets
uj5u.com熱心網友回復:
我認為這在ListView.builder中是不可能的,因為在構建widgets樹時,它的動態專案的高度是不知道的。相反,我的縮略圖部件被預先建立,并在它們被建立后添加到Row,并用SingleChildScrollView包裹行,使其可滾動。所以,我的縮略圖串列已經準備好放置在我的Form中:
class AttachmentsListWidget extends StatelessWidget{
const AttachmentsListWidget({
Key鍵。
@required this.items,
@required this.onAttachmentDeleted,
}) : super(key: 關鍵)。
final List<String> items;
final Function(String) onAttachmentDeleted;
@override
Widget build(BuildContext context) {
var _thumbnailsScrollController = ScrollController()。
final thumbnails = <Widget> [];
小工具thumbnailsWidget。
if (items.length > 0) {
for (int i = 0; i < items.length; i ) {
thumbnails.add(
附件Widget(
attachment: items[i],
onDeleteClicked: (String attachment) => onAttachmentDeleted(attachment) 。
),
);
}
thumbnailsWidget = Container(
孩子。列(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Scrollbar()
isAlwaysShown: true。
控制器。_thumbnailsScrollController,
孩子。SingleChildScrollView(
控制器。_thumbnailsScrollController,
滾動方向。Axis.horizontal,
孩子。行(
children: thumbnails,
crossAxisAlignment: CrossAxisAlignment.start,
),
),
),
],
),
);
} else {
thumbnailsWidget = Container();
}
return thumbnailsWidget。
}
(同時,添加了始終可見的滾動條)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/309244.html
標籤:
