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]),
            ),