Flutter Can';对于如何在自定义小部件中使用ListView,找不到正确的布局选项
我试图提取重用一个简单的小部件,然后在父小部件中引用它。自定义小部件只是使用一行来布局文本字段和按钮,在下面我希望有一个显示项目的列表视图。然后,我将customwidget嵌入到parent中,但它不断抛出错误。我还没有弄明白如何让自定义小部件在可以使用ListView或ColumnLayout的地方工作。下面是演示该问题的两个简化小部件 这是父窗口小部件,我在这里调用自定义窗口小部件playlicontrol()Flutter Can';对于如何在自定义小部件中使用ListView,找不到正确的布局选项,flutter,flutter-layout,Flutter,Flutter Layout,我试图提取重用一个简单的小部件,然后在父小部件中引用它。自定义小部件只是使用一行来布局文本字段和按钮,在下面我希望有一个显示项目的列表视图。然后,我将customwidget嵌入到parent中,但它不断抛出错误。我还没有弄明白如何让自定义小部件在可以使用ListView或ColumnLayout的地方工作。下面是演示该问题的两个简化小部件 这是父窗口小部件,我在这里调用自定义窗口小部件playlicontrol() @覆盖 小部件构建(构建上下文){ 返回脚手架( appBar:appBar(
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“我的播放列表”),
),
主体:容器(
子:列(
crossAxisAlignment:crossAxisAlignment.start,
textDirection:textDirection.ltr,
儿童:[
容器(
对齐:对齐.center,
保证金:全部(20),
子项:文本('Test'),
),
播放列表控件(),
],
),
),
抽屉:侧抽屉(),
);
}
}
这是播放控制小部件
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 200,
child: TextField(),
),
ButtonTheme(
minWidth: 30,
child: RaisedButton(
textColor: Colors.white,
child: Text('add'),
onPressed: () {},
)),
],
),
),
Expanded(
child: ListView(
children: <Widget>[
Text('Widget 1'),
Text('Widget 2'),
],
),
)
],
),
);
}
}
@覆盖
小部件构建(构建上下文){
返回容器(
保证金:所有(10),
子:列(
儿童:[
容器(
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
容器(
宽度:200,
子项:TextField(),
),
钮扣(
最小宽度:30,
孩子:升起按钮(
textColor:Colors.white,
子项:文本('add'),
按下:(){},
)),
],
),
),
扩大(
子:ListView(
儿童:[
文本(“小部件1”),
文本('Widget 2'),
],
),
)
],
),
);
}
}
无论我尝试什么,它总是抱怨与高度相关的布局问题。我本以为将ListView包装成Expanded可以解决这个问题,但事实并非如此。只有当我使用容器并指定高度时,我才不会得到错误,但我想使用任何可用的空间
如何使PlayControl()小部件在父控件内正确呈现?您忘记将PlayControl的第一个容器包装在扩展的小部件中
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
家:脚手架(
appBar:appBar(
标题:文本(“我的播放列表”),
),
主体:容器(
子:列(
mainAxisSize:mainAxisSize.max,
crossAxisAlignment:crossAxisAlignment.start,
textDirection:textDirection.ltr,
儿童:[
容器(
对齐:对齐.center,
保证金:全部(20),
子项:文本('Test'),
),
播放列表控件(),
],
),
),
));
}
}
类播放控件扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
扩大回报(
子:容器(
保证金:所有(10),
子:列(
儿童:[
容器(
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
容器(
宽度:200,
子项:TextField(),
),
钮扣(
最小宽度:30,
孩子:升起按钮(
textColor:Colors.white,
子项:文本('add'),
按下:(){},
)),
],
),
),
扩大(
子:ListView(
儿童:[
文本(“小部件1”),
文本('Widget 2'),
],
),
)
],
),
),
);
}
}
尝试在扩展的中包装播放控件
小部件
是的,尝试过了……不起作用。仅供参考,如果我使用singlechildscrollview和inside列…它允许我这样做。但是,我的目标是使用ListView.builder()动态创建列表……我认为问题在于列中的ListView。这个解决方案可以帮助我以前阅读该线程,因此我尝试使用推荐的带有“Expanded”的包装。根据文档,这应该将listView限制在剩余的空间内……但在我的例子中,它抛出了一个错误。一旦区分,如果我在父窗口小部件中使用expanded with listview,它就会工作。当我引用子窗口小部件时,会出现此问题。在容器上使用高度可以工作,但它不会动态使用可用空间。您在哪个容器上设置高度?子窗口小部件中的那个?
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 200,
child: TextField(),
),
ButtonTheme(
minWidth: 30,
child: RaisedButton(
textColor: Colors.white,
child: Text('add'),
onPressed: () {},
)),
],
),
),
Expanded(
child: ListView(
children: <Widget>[
Text('Widget 1'),
Text('Widget 2'),
],
),
)
],
),
);
}
}
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
appBar: AppBar(
title: Text('My Playlists'),
),
body: Container(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
textDirection: TextDirection.ltr,
children: <Widget>[
Container(
alignment: Alignment.center,
margin: EdgeInsets.all(20),
child: Text('Test'),
),
PlayListControl(),
],
),
),
));
}
}
class PlayListControl extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
margin: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: 200,
child: TextField(),
),
ButtonTheme(
minWidth: 30,
child: RaisedButton(
textColor: Colors.white,
child: Text('add'),
onPressed: () {},
)),
],
),
),
Expanded(
child: ListView(
children: <Widget>[
Text('Widget 1'),
Text('Widget 2'),
],
),
)
],
),
),
);
}
}