【问题标题】:Flutter - Can't set Horizontal ListView with SizedBoxFlutter - 无法使用 SizedBox 设置水平 ListView
【发布时间】:2021-09-25 03:09:49
【问题描述】:

我是 Flutter 的新手。我有 2 个ContainersSizedBox。我正在尝试为第一个设置水平滚动:Slider1LocalPage()

我阅读了它并尝试使用scrollDirection: Axis.horizontal,但它会导致错误。我尝试使用Column,但没有成功。

帮助我的示例将帮助我学习和理解颤振。 这是我在 ma​​in.dart

中的小部件主体
      body: SingleChildScrollView(
      child: Column(
        children: <Widget>[
          Text(
            'Horizontal - can\'t deal with',
            style: TextStyle(fontSize: 18),
          ),
          Container(
            child: SizedBox(height: 260.0, child: Slider1LocalPage()),
          ),
          Text(
            'Vertical',
            style: TextStyle(fontSize: 18),
          ),
          Container(
            child: SizedBox(height: 290, child: List1LocalPage()),
          )
        ],
      ),
    ),

Slider1LocalPage()

class Slider1LocalPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Scaffold(
        body: FutureBuilder<List<Record>>(
          future: List1Api.getList1Locally(context),
          builder: (context, snapshot) {
            final records = snapshot.data;

            switch (snapshot.connectionState) {
              case ConnectionState.waiting:
                return Center(child: CircularProgressIndicator());
              default:
                if (snapshot.hasError) {
                  return Center(child: Text('Some error occurred!'));
                } else {
                  return buildList1(records);
                }
            }
          },
        ),
      );

  Widget buildList1(List<Record> records) => ListView.builder(
        physics: BouncingScrollPhysics(),
        itemCount: records.length,
        itemBuilder: (context, index) {
          final record = records[index];

          return ListTile(
            onTap: () => Navigator.of(context).push(MaterialPageRoute(
              builder: (BuildContext context) => ContentPage(record: record),
            )),
            leading: CircleAvatar(
              backgroundImage: NetworkImage(record.urlAvatar),
            ),
            title: Text(record.title1),
            subtitle: Text(record.content1),
          );
        },
      );
}

【问题讨论】:

    标签: visual-studio flutter dart listview mobile


    【解决方案1】:

    @Divyesh 回答是好的,这里是一起使用Horizontal vertical 列表的演示。我更喜欢使用 CustomScrollViewMultiSliver 来处理 sliver 类型。 只需添加sliverTools 以使用MultiSliver,否则将几乎没有额外的代码来处理这种情况。

    
      @override
      Widget build(BuildContext context) {
        return CustomScrollView(
          slivers: [
            MultiSliver(
              children: [
                Text(
                  'Horizontal - can deal with',
                  style: TextStyle(fontSize: 18),
                ),
                MultiSliver(
                  children: [
                    // Slider1LocalPage(),
                    Container(
                      height: 140,
                      child: ListView.builder(
                        shrinkWrap: true,
                        scrollDirection: Axis.horizontal,
                        physics: BouncingScrollPhysics(),
                        itemCount: 20,
                        itemBuilder: (context, index) {
                          // final record = records[index];
    
                          return Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: GestureDetector(
                              // onTap: () => Navigator.of(context).push(MaterialPageRoute(
                              //   builder: (BuildContext context) => ContentPage(record: record),
                              // ),),
                              child: Column(
                                children: [
                                  CircleAvatar(
                                    radius: 40,
                                    backgroundImage: NetworkImage(
                                      "https://www.rd.com/wp-content/uploads/2017/09/01-shutterstock_476340928-Irina-Bg-1024x683.jpg",
                                    ),
                                  ),
                                  Text("title here"),
                                  Text("subtitle"),
                                ],
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  ],
                ),
                Text(
                  'Vertical',
                  style: TextStyle(fontSize: 18),
                ),
    
                MultiSliver(
                  children: List.generate(
                    23,
                    (index) => Container(
                      height: 50,
                      width: double.infinity,
                      color: index % 2 == 0 ? Colors.cyanAccent : Colors.pinkAccent,
                    ),
                  ),
                ),
                // Container(
                //  color: COlors,
    
                //     // child: List1LocalPage(),
                //   ),
                // )
              ],
            ),
          ],
        );
      }
    

    【讨论】:

      【解决方案2】:

      您可以在此处查看工作演示:https://flutter.dev/docs/cookbook/lists/horizontal-list

      Widget buildList1(List<Record> records) => ListView.builder(
              scrollDirection: Axis.horizontal,
              physics: BouncingScrollPhysics(),
              itemCount: records.length,
              itemBuilder: (context, index) {
                final record = records[index];
      
                return ListTile(
                  onTap: () => Navigator.of(context).push(MaterialPageRoute(
                    builder: (BuildContext context) => ContentPage(record: record),
                  )),
                  leading: CircleAvatar(
                    backgroundImage: NetworkImage(record.urlAvatar),
                  ),
                  title: Text(record.title1),
                  subtitle: Text(record.content1),
                );
              },
            );
      

      问题是由 ListTile 引起的,因为它占用了整个宽度。 ListTile 似乎不适合水平列表视图。要添加点击操作,您可以使用 GestureDetector。

      【讨论】:

      • 好的。我可以用 Container 或 SizedBox 小部件包装 ListTile 小部件吗?有代码示例吗?
      • 你可以试一试,你会从中得到灵感。您可以使用 Row & Column 小部件轻松创建类似列表磁贴的 UI。
      【解决方案3】:

      感谢 MultiSliver 和有关 ListTile 的信息。两者将来都会有用。所以,现在水平 ListView 工作。几乎很好,但现在我在每个列中都有数据循环。我知道原因在 Widget buildSlider1 ListView 但找不到解决方案。任何提示?screnshot

        Widget buildSlider1(List<Record> records) => ListView.builder(
          physics: BouncingScrollPhysics(),
          itemCount: records.length,
          itemBuilder: (context, index) {
            final record = records[index];
      
            return Padding(
              padding: const EdgeInsets.all(8.0),
              child: GestureDetector(
                // onTap: () => Navigator.of(context).push(MaterialPageRoute(
                //   builder: (BuildContext context) => ContentPage(record: record),
                // ),),
                child: Column(
                  children: [
                    Text(record.title1),
                    Text(record.content1),
                  ],
                ),
              ),
            );
          },
        );
      

      _

      Widget build(BuildContext context) {
      return CustomScrollView(
        slivers: [
          MultiSliver(
            children: [
              Text(
                'Horizontal - can deal with',
                style: TextStyle(fontSize: 18),
              ),
              MultiSliver(
                children: [
                  Container(
                    height: 210,
                    child: ListView.builder(
                      shrinkWrap: true,
                      scrollDirection: Axis.horizontal,
                      physics: BouncingScrollPhysics(),
                      itemCount: 20,
                      itemBuilder: (context, index) {
                        // final record = records[index];
      
                        return Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: GestureDetector(
                            // onTap: () => Navigator.of(context).push(MaterialPageRoute(
                            //   builder: (BuildContext context) => ContentPage(record: record),
                            // ),),
                            child: Column(
                              children: [
                                SizedBox(
                                    width: 220,
                                    height: 280,
                                    child: Slider1LocalPage()),
                              ],
                            ),
                          ),
                        );
                      },
                    ),
                  ),
                ],
              ),
              Text(
                'Vertical',
                style: TextStyle(fontSize: 18),
              ),
              MultiSliver(children: [
                SizedBox(
                    height: 380, width: double.infinity, child: List1LocalPage()),
              ]),
            ],
          ),
        ],
      );}
      

      【讨论】:

        猜你喜欢
        • 2012-05-01
        • 2019-11-04
        • 2021-10-06
        • 2020-10-31
        • 1970-01-01
        • 2018-10-25
        • 2021-12-14
        • 1970-01-01
        • 2019-08-15
        相关资源
        最近更新 更多