Listview 使用不同的窗口小部件和列表项浏览列表视图

Listview 使用不同的窗口小部件和列表项浏览列表视图,listview,widget,flutter,scrollable,Listview,Widget,Flutter,Scrollable,我不确定我是否遗漏了什么。我正在玩Flutter,我想用一些文本小部件、按钮和其他小部件构建一个(简单的)视图(见下图)。这些小部件后面应该有一个项目列表。整个视图(当然除了应用程序栏)应该是可滚动的,而不仅仅是项目 这就是为什么我将所有内容都放在ListView中。但是我不能这样做(而items是一个带有字符串值的映射): 。。。 家:脚手架( appBar:appBar( 标题:文本(“应用程序栏”), ), 正文:新列表视图( 儿童:[ 新文本(“某些文本”), 新的扁平按钮(…), 新图

我不确定我是否遗漏了什么。我正在玩Flutter,我想用一些文本小部件、按钮和其他小部件构建一个(简单的)视图(见下图)。这些小部件后面应该有一个项目列表。整个视图(当然除了应用程序栏)应该是可滚动的,而不仅仅是项目

这就是为什么我将所有内容都放在ListView中。但是我不能这样做(而
items
是一个带有字符串值的映射):

。。。
家:脚手架(
appBar:appBar(
标题:文本(“应用程序栏”),
),
正文:新列表视图(
儿童:[
新文本(“某些文本”),
新的扁平按钮(…),
新图像。资产(…),
items.map((item)=>新填充(
子项:新文本(项目标题),
))托利斯先生()
],
),
),
...
获得所需视图的正确方法是什么

提前谢谢


ListView中的子项是iTen列表,因此,如果要显示按钮或文本,小部件树是:

Scaffold
 appBar: AppBar
 body:  Container
   child: ListView       
            ListItem
            ListItem
            ListItem
然后,在您的情况下,您可以使用一列显示“固定小部件”(文本、按钮)+列表视图可滚动:

Scaffold
 appBar: AppBar
 body:  Column 
     [
        Text,
        Buttom,
        ListView
          ListItem
          ListItem
          ListItem
     ]

您可以在
正文
中使用以下代码

body: SingleChildScrollView( //add to Scroll whole screen
    child: Column(
        children: <Widget>[
            new Text('Some Text'), //Element-1
            new FlatButton(...),   //Element-2
            new Image.asset(...),  //Element-3
            items.map((item)=>new Padding(child: new Text(item.title),)).toList(), //Element-4
            ListView.separated(    //Element-5
                shrinkWrap: true,  //this property is must when you put List/Grid View inside SingleChildScrollView
                physics: NeverScrollableScrollPhysics(), //this property is must when you put List/Grid View inside SingleChildScrollView
                itemCount: listItems.length,
                itemBuilder: (context, i) {
                    return ListTile(
                        title: Text(listItems[i].Title),
                        subtitle: Text(listItems[i].Description),
                    );
                },
                separatorBuilder: (context, i) {
                    return Divider();
                },
            ),
        ],
    ),
),
body:SingleChildScrollView(//添加以滚动整个屏幕
子:列(
儿童:[
新文本('Some Text'),//元素-1
新建FlatButton(…),//元素-2
新建Image.asset(…),//元素-3
items.map((item)=>newpadding(子项:新文本(item.title))).toList(),//元素-4
ListView.separated(//元素-5)
shrinkWrap:true,//将列表/网格视图放在SingleChildScrollView中时必须使用此属性
物理:NeverScrollableScrollPhysics(),//将列表/网格视图放入SingleChildScrollView中时,必须使用此属性
itemCount:listItems.length,
itemBuilder:(上下文,i){
返回列表块(
标题:文本(列表项[i]。标题),
字幕:文本(列表项[i].说明),
);
},
separatorBuilder:(上下文,i){
返回分隔符();
},
),
],
),
),
您可以这样使用

 ListView(
     shrinkWrap: true,
     children: <Widget>[
          Text('hi'),//first widget
          Text('hi2'),//second widget
          Flex(
              direction: Axis.horizontal,children: <Widget>[
                      Expanded(
                        child: ListView.builder(
                            shrinkWrap: true,
                            itemCount: 3,
                            itemBuilder: (BuildContext context, int index){
                              return ...

您可以使用
ListView.builder
,因为这样效率更高,因为项目只有在滚动到屏幕上时才会创建。在第一个位置,您可以放置列表中没有的小部件,如下所示:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('App bar')),
    body: ListView.builder(
      itemCount: items.length + 1,
      itemBuilder: (context, index) {
        if (index == 0) {
          return Column(
            children: <Widget>[
              Text('Some Text'),
              FlatButton(child: Text('A flat button'), onPressed: () {}),
              Image.asset("An image"),
            ],
          );
        }
        return Text('Item ${items[index].title}');
      },
    ),
  );
}
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本('appBar')),
正文:ListView.builder(
itemCount:items.length+1,
itemBuilder:(上下文,索引){
如果(索引==0){
返回列(
儿童:[
文本(“某些文本”),
FlatButton(子项:Text('A flat button'),按下时:(){}),
图像。资产(“图像”),
],
);
}
返回文本('Item${items[index].title}');
},
),
);
}

您可以使用Slivers来实现这一点,看看Flatter团队的一篇文章:另一个选项是使用SingleChildScrollView、Column和create List,在您拥有列表后,按您想要的顺序以编程方式添加项目,在列的children属性中设置listview是一个很好的解决方案,它提供了额外的小部件:我担心,将listview放在一个列的文本和按钮下面,只会使listview可以滚动。我希望列中的所有内容都可以滚动。明白了。在这种情况下,条子很合适。恭喜滚动列表时查看其他区域不滚动(文本和图像)
 ListView.builder(
      itemCount: get.length + 2, // add room for the two extra
      itemBuilder: (BuildContext context, int index) {
        if(index == 0){
         return Text('Custom any widget');
        }
        if(index == 1){
         return Text('Custom any widget');
        }
        index -= 2; // decrement index so that it's now in the range [0..length]
        return Bubble(
            style: styleSomebody,
            child: Container(
              ... 
            ));
      }),
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text('App bar')),
    body: ListView.builder(
      itemCount: items.length + 1,
      itemBuilder: (context, index) {
        if (index == 0) {
          return Column(
            children: <Widget>[
              Text('Some Text'),
              FlatButton(child: Text('A flat button'), onPressed: () {}),
              Image.asset("An image"),
            ],
          );
        }
        return Text('Item ${items[index].title}');
      },
    ),
  );
}