首页 文章

如何在flutter中创建水平和垂直可滚动的小部件

提问于
浏览
2

sample Layout image

我正在尝试附加布局 . 它有两个容器 . - 首先是一个水平滚动的固定大小的盒子 - 第二张卡片占据剩余空间,里面有列表视图 .

我怎样才能实现这种布局?

如您所见,两个容器的滚动方向都不同 . 代码工作到标签视图(第一个框)但是一旦我添加第二个盒子,即卡片,它没有显示任何内容并在控制台上收到错误,如下所示 .

I/flutter ( 9412):   AnimatedDefaultTextStyle ← _InkFeatures-[GlobalKey#85877 ink renderer] ←
I/flutter ( 9412):   NotificationListener<LayoutChangedNotification> ← ⋯
I/flutter ( 9412):   parentData: offset=Offset(0.0, 0.0); flex=null; fit=null (can use size)
I/flutter ( 9412):   constraints: BoxConstraints(0.0<=w<=340.0, 0.0<=h<=Infinity)
I/flutter ( 9412):   size: MISSING
I/flutter ( 9412):   additionalConstraints: BoxConstraints(biggest)
I/flutter ( 9412): This RenderObject had the following descendants (showing up to depth 5):
I/flutter ( 9412):   RenderFlex#93e12 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 9412):     RenderRepaintBoundary#977a7 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 9412):       RenderCustomPaint#b6be8 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 9412):         RenderRepaintBoundary#e449b NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 9412):           _RenderExcludableScrollSemantics#293fd NEEDS-LAYOUT NEEDS-PAINT



class _KanbanState extends State<Kanban> {
  @override
  Widget build(BuildContext context) {

    Widget tagList = 
    new SizedBox(
      height: 100.0,
      child: 
    new Column(
      children: <Widget>[
        new Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            new ActionChip(
                backgroundColor: Colors.yellow,
                label: new Text('Tag1'),
                onPressed: () {
                  // update board with selection
                }),
            new ActionChip(
                //backgroundColor: Colors.transparent,
                label: new Text('Tag2'),
                onPressed: () {
                  // update board with selection
                }),
            new ActionChip(
                label: new Text('Tag3'),
                onPressed: () {
                  // update board with selection
                }),
            new ActionChip(
                label: new Text('Tag4'),
                onPressed: () {
                  // update board with selection
                }),
          ],
        )
      ],
    ),);

    Widget boardView = new Flexible(
      // margin: new EdgeInsets.symmetric(vertical: 15.0),
      child: new Column(
        children: <Widget>[
          new ListView.builder(
            scrollDirection: Axis.vertical,
            itemCount: 5,
            itemBuilder: (BuildContext context, int index) {
              return new ListTile(
                onTap: () {
                },
                title: new Row(
                  children: <Widget>[
                    new Expanded(child: new Text("This is item name")),
                    new Text("12 Dec 18"),
                  ],
                ),
              );
            },
          ),
        ],
      ),
    );

    //  int _value=0;
    return new Container(
        child: new Scaffold(
          appBar: new AppBar(
            elevation: 1.0,
            title: new Text("Test title"),
          ),
          body: new Container(
              margin: new EdgeInsets.all(10.0),
              child: Column(
                children: <Widget>[
                  tagList,
                  boardView,
                ],
              )),
        ));
  }
}

1 回答

  • 1

    tl; dr:以下代码执行您想要的操作= D.

    import 'package:flutter/material.dart';
    
    void main() async {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'stack overflow',
          theme: ThemeData(
            primarySwatch: Colors.pink,
          ),
          routes: {},
          home: KanbanState(),
        );
      }
    }
    
    class KanbanState extends StatefulWidget {
      @override
      KanbanStateState createState() {
        return KanbanStateState();
      }
    }
    
    class KanbanStateState extends State<KanbanState> {
      @override
      Widget build(BuildContext context) {
        Widget tagList = Container(
          color: Colors.green,
          height: 100.0,
          child: ListView(
            scrollDirection: Axis.horizontal,
            children: <Widget>[
              Row(
                children: <Widget>[
                  ActionChip(
                      backgroundColor: Colors.yellow,
                      label: Text('Tag1'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      //backgroundColor: Colors.transparent,
                      label: Text('Tag2'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      label: Text('Tag3'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      label: Text('Tag4'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      backgroundColor: Colors.yellow,
                      label: Text('Tag1'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      //backgroundColor: Colors.transparent,
                      label: Text('Tag2'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      label: Text('Tag3'),
                      onPressed: () {
                        // update board with selection
                      }),
                  ActionChip(
                      label: Text('Tag4'),
                      onPressed: () {
                        // update board with selection
                      }),
                ],
              )
            ],
          ),
        );
    
        Widget boardView = Container(
          color: Colors.blue,
          child: ListView.builder(
            scrollDirection: Axis.vertical,
            itemCount: 15,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(
                onTap: () {},
                title: Row(
                  children: <Widget>[
                    Expanded(child: Text("This is item name")),
                    Text("12 Dec 18"),
                  ],
                ),
              );
            },
          ),
        );
    
        //  int _value=0;
        return Scaffold(
            appBar: AppBar(
              elevation: 1.0,
              title: Text("Test title"),
            ),
            body: Container(
              color: Colors.amber,
              child: new Column(
                children: <Widget>[
                  tagList,
                  Expanded(
                    child: boardView,
                  )
                ],
              ),
              margin: EdgeInsets.all(10.0),
            ));
      }
    }
    

    继承思想过程:我开始清理每个小部件并确保它们能够正确显示 . 在taglist小部件中,请注意您有一行作为列中的唯一小部件 . 在boardView中,LisView也是列中唯一的元素;

    然后我添加了更多项目以确保两个卷轴都能正常工作 . 在tagList中添加 scrollDirection: Axis.horizontal 确保了这一点 .

    最后,时间将它们放在一起并显示两个元素 . 删除顶部容器,因为Scaffold就足够了 . 然后就是将boardView放在Expanded小部件中 .

    这是一个有趣的练习 . = d

相关问题