Flutter 颤振多水平列表
我尝试了大量的布局和小部件。每次我收到一条新的异常消息。基本上,我的目标是在彼此下面有多个水平列表 注意:我不能使用Flutter 颤振多水平列表,flutter,Flutter,我尝试了大量的布局和小部件。每次我收到一条新的异常消息。基本上,我的目标是在彼此下面有多个水平列表 注意:我不能使用ListView.builder,因为项目不会开始加载,而是每个项目在6秒后加载 @override Widget build(BuildContext context) { return ListView( shrinkWrap: true, scrollDirection: Axis.horizontal,
ListView.builder
,因为项目不会开始加载,而是每个项目在6秒后加载
@override
Widget build(BuildContext context) {
return
ListView(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
children: store.coins.map((coin) => ListTilWidgetFirst(coin)).toList(),
);
}
class ListTilWidgetFirst extends StatelessWidget {
ListTilWidgetFirst(this.coin);
final Channel coin;
@override
Widget build(BuildContext context) {
return Container( height: 300.0,
child: Card(
child:
ListTile(
leading: new Image.network(
coin.img,
fit: BoxFit.fill,
width: 150.0,
height: 40.0,
),
title: new Text(
coin.name,
style: new TextStyle(
fontSize: 14.0,
),
),
subtitle: new Text(
coin.name,
style: new TextStyle(fontSize: 11.0),
),
),
),
);
}
}
// to be views in anotehr class
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body:Column(
children: <Widget>[
CategorySecond()
],
)
);
}
@覆盖
小部件构建(构建上下文){
返回
列表视图(
收缩膜:对,
滚动方向:轴水平,
子项:store.coins.map((coin)=>ListTilWidgetFirst(coin)).toList(),
);
}
类ListTilWidgetFirst扩展了无状态小部件{
ListTilWidgetFirst(这个.coin);
最终通道硬币;
@凌驾
小部件构建(构建上下文){
返回容器(高度:300.0,
孩子:卡片(
儿童:
列表砖(
领先:新图像网络(
coin.img,
fit:BoxFit.fill,
宽度:150.0,
身高:40.0,
),
标题:新文本(
coin.name,
样式:新文本样式(
字体大小:14.0,
),
),
字幕:新文本(
coin.name,
样式:新文本样式(fontSize:11.0),
),
),
),
);
}
}
//要成为anotehr类中的视图
类主屏幕扩展无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:专栏(
儿童:[
类别第二()
],
)
);
}
您的代码在显示您尝试的内容方面做得并不好,您对您尝试执行的内容的解释也有点欠缺,但我认为我可以提供帮助。但在将来,最好是尽可能地将代码包含在收到的错误中
下面的代码显示了三个列表,它们最初为空,然后填充数据(模拟加载)
如果您在该容器上指定了高度和宽度,它实际上仍然保持相同的大小,这在您考虑之前有点令人困惑
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.red,
height: 200.0,
width: 200.0,
);
}
}
发生的情况是,容器希望将自身大小调整为您给定的大小,但如果这样做,它将不知道如何在其父容器中定位自身。因此,它将保持与父容器相同的大小
如果您将其包装在一个小部件中,使其不受其父对象大小的约束,例如对齐或居中,那么它将是您告诉它的大小
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topLeft,
child: Container(
color: Colors.red,
height: 200.0,
width: 200.0,
),
);
}
}
这会导致左上角出现一个红方块。但是如果您不指定高度和宽度,而是指定一个子项,则它现在会根据其子项调整自身大小
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Align(
alignment: Alignment.center,
child: Container(
color: Colors.red,
child: Text(
"Some Text",
style: TextStyle(color: Colors.black, decoration: null),
),
),
),
);
}
}
这会导致屏幕中间的文本窗口小部件(忽略方向性控件,它只是因为我不使用ObjalApp,如果不使用ObjalApp的话,它是需要文本的)。如果您想将其放入列中,则行为会再次发生变化。如果没有子容器,则容器会将其自身大小调整为允许的最小值(恰好为零)
这将扩展到屏幕的全部大小,但您将在行/垂直列表视图中进行换行,这样它将正确调整自身大小要考虑的一点是,不要在孩子身上设置明确的宽度,您可能希望您的孩子根据父身高来调整大小。这意味着父母需要一个显式的高度。
下面是一个例子:class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Container(
height: 200.0,
child: ListView(
scrollDirection: Axis.horizontal,
children: [1, 2]
.map(
(v) => AspectRatio(
aspectRatio: 1.5,
child: Container(
color: Colors.red,
child: Row(
children: <Widget>[
Expanded(
child: Container(color: Colors.blue),
),
Text(
"Some Text",
style: TextStyle(color: Colors.white, decoration: null),
),
],
),
),
),
)
.toList(),
),
),
),
);
}
}
不过,你要知道,当我测试这一点时,它实际上不会在按下“获取硬币”按钮加载列表后重建,至少在我进行热加载之前是这样。这是因为状态没有通过颤振通量框架正确传播,这似乎是一个设计缺陷。如果你没有看到这一点,那么忽略它,但是如果你这样做,我建议你就这一点开一个新的问题,因为这个答案已经足够长了,我个人不喜欢flux,所以你必须找其他人来帮助它。你的代码在展示你的尝试方面做得并不好,你对你尝试做什么的解释也有点欠缺,但我认为我无论如何都可以帮上忙。但是在将来,最好是尽可能地包含代码以及收到的错误 下面的代码显示了三个列表,它们最初为空,然后填充数据(模拟加载) 如果您在该容器上指定了高度和宽度,它实际上仍然保持相同的大小,这在您考虑之前有点令人困惑
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.red,
height: 200.0,
width: 200.0,
);
}
}
发生的情况是,容器希望将自身大小调整为您给定的大小,但如果这样做,它将不知道如何在其父容器中定位自身。因此,它将保持与父容器相同的大小
如果您将其包装在一个小部件中,使其不受其父对象大小的约束,例如对齐或居中,那么它将是您告诉它的大小
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topLeft,
child: Container(
color: Colors.red,
height: 200.0,
width: 200.0,
),
);
}
}
这会导致左上角出现一个红方块。但是如果您不指定高度和宽度,而是指定一个子项,则它现在会根据其子项调整自身大小
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Align(
alignment: Alignment.center,
child: Container(
color: Colors.red,
child: Text(
"Some Text",
style: TextStyle(color: Colors.black, decoration: null),
),
),
),
);
}
}
这会导致屏幕中间的文本窗口小部件(忽略方向性控件,它只是因为我不使用ObjalApp,如果不使用ObjalApp的话,它是需要文本的)。如果您想将其放入列中,则行为会再次发生变化。如果没有子容器,则容器会将其自身大小调整为允许的最小值(恰好为零)
这将扩展到屏幕的全部大小,但您将在行/垂直列表视图中进行换行,这样它将正确调整自身大小要考虑的一点是,不要在孩子上设置明确的宽度,你可能希望你的孩子根据父身高来调整大小。
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Align(
alignment: Alignment.center,
child: Column(
children: <Widget>[
Expanded(
child: Container(
color: Colors.red,
child: Text(
"Some Text",
style: TextStyle(color: Colors.black, decoration: null),
),
),
),
Container(
color: Colors.blue,
child: Text(
"Some More Text",
style: TextStyle(color: Colors.black, decoration: null),
),
),
],
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: ListView(
children: <Widget>[
Container(
child: IntrinsicHeight(
child: Row(
children: <Widget>[
Expanded(
child: Container(color: Colors.blue),
),
Text(
"Some Text",
style: TextStyle(color: Colors.white, decoration: null),
),
],
),
),
)
],
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
Container(
width: 200.0,
child: IntrinsicHeight(
child: Row(
children: <Widget>[
Expanded(
child: Container(color: Colors.blue),
),
Text(
"Some Text",
style: TextStyle(color: Colors.white, decoration: null),
),
],
),
),
)
],
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Container(
height: 200.0,
child: ListView(
scrollDirection: Axis.horizontal,
children: [1, 2]
.map(
(v) => AspectRatio(
aspectRatio: 1.5,
child: Container(
color: Colors.red,
child: Row(
children: <Widget>[
Expanded(
child: Container(color: Colors.blue),
),
Text(
"Some Text",
style: TextStyle(color: Colors.white, decoration: null),
),
],
),
),
),
)
.toList(),
),
),
),
);
}
}
class HomeScreen extends StatefulWidget {
@override
HomeScreenState createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> with StoreWatcherMixin<HomeScreen> {
CoinStore store;
@override
void initState() {
super.initState();
store = listenToStore(coinStoreToken);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flux Crypto Ticker'),
actions: <Widget>[
RaisedButton(
color: Colors.blueGrey,
onPressed: () {
print("Loading coins");
loadCoinsAction.call();
},
child: Text('Get Coins'),
)
],
),
body: Column(
children: <Widget>[
Container(
height: 200.0,
child: ListView(
scrollDirection: Axis.horizontal,
children: store.coins.map((coin) => CoinWidget(coin)).toList(),
),
),
],
),
);
}
}
class CoinWidget extends StatelessWidget {
CoinWidget(this.coin);
final Coin coin;
@override
Widget build(BuildContext context) {
return AspectRatio(
aspectRatio: 2.0,
child: Container(
padding: EdgeInsets.all(10.0),
decoration: BoxDecoration(
border: Border.all(width: 5.0),
),
child: Card(
elevation: 10.0,
color: Colors.lightBlue,
child: Row(
children: <Widget>[
Expanded(
child: ListTile(
title: Text(coin.name),
leading: CircleAvatar(
child: Text(
coin.symbol,
style: TextStyle(
fontSize: 13.0,
),
),
radius: 90.0,
foregroundColor: Colors.white,
backgroundColor: Colors.amber,
),
subtitle: Text("\$${coin.price.toStringAsFixed(2)}"),
),
)
],
),
)),
);
}
}
ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: store.coins.length,
itemBuilder: (context, i) => CoinWidget(store.coins[i]),
),