包含固定列表视图的列表视图

时间:2018-07-30 09:38:44

标签: dart flutter

我想基本上创建一个设置屏幕。实际上,我的屏幕看起来像“设置”部分,该部分由一个标题和一个不可滚动的列表视图组成。我想将这些部分放在列表视图中,以使屏幕可滚动,并使每个设置部分都位于最后一个之后。

这是我的实际屏幕。

Actual screen

这是我的代码。

Widget build(BuildContext context) {
return Container(
    child: Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  mainAxisAlignment: MainAxisAlignment.start,
  mainAxisSize: MainAxisSize.min,
  children: <Widget>[
        Expanded(
            child: SettingSection('Communication', [
          SettingsPayload('Email', 'Switch', () => (print('Function :)'))),
          SettingsPayload('Notifications', 'Switch'),
        ])),
        Expanded(
            child: SettingSection('Hello', [
          SettingsPayload('Email', 'Normal', () => print('value'),
              Icons.arrow_forward_ios),
          SettingsPayload('Notifications', 'Normal', () => print('hello')),
        ]))
  ],
));

我如何构建每个列表

buildlistSettings() {
return ListView.builder(
    physics: ScrollPhysics(parent: NeverScrollableScrollPhysics()),
    padding: const EdgeInsets.all(15.0),
    itemBuilder: (context, i) {
      if (i < widget.listSettings.length) {
        return Column(
          children: <Widget>[
            buildTileSettings(widget.listSettings[i]),
            Divider(),
          ],
        );
      }
    });
  }

@override


Widget build(BuildContext context) {
    return Container(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Container(
            padding: EdgeInsets.only(left : 10.0),
              height: 25.0,
              decoration:
                  BoxDecoration(color: Color.fromRGBO(223, 230, 233, 0.5), border: Border(bottom: BorderSide(color: Color.fromRGBO(223, 230, 233, 0.5), width: 1.0))),
              child: Row(children: <Widget>[Text(
                widget.title,
                style: TextStyle(fontSize: 15.0, color: Colors.blueGrey), 
              )])),
          Expanded(child: buildlistSettings()),
        ],
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:2)

我认为这里存在一系列问题,其中主要是试图将ListView放在ListView内(并且必须关闭滚动),但主要是使用{{1} },它试图沿相关方向填充所有空间,但要在另一个容器内部,容器本身是不受限制的。

我将在根目录使用Expanded,然后使用简单的ListViewColumnListTile小部件构建子级。这是一个可行的示例(重复数据以确保有足够的滚动空间):

Divider

如果传入设置数据可变,则可以在根级别使用import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', home: new MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { final String title; MyHomePage({Key key, this.title}) : super(key: key); @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: ListView( children: <Widget>[ SettingSection('Communication', [ SettingsPayload('Email', 'Switch', () => (print('Function :)'))), SettingsPayload('Notifications', 'Switch'), ]), SettingSection('Hello', [ SettingsPayload('Email', 'Normal', () => print('value'), Icons.arrow_forward_ios), SettingsPayload('Notifications', 'Normal', () => print('hello')), ]), SettingSection('Communication', [ SettingsPayload('Email', 'Switch', () => (print('Function :)'))), SettingsPayload('Notifications', 'Switch'), ]), SettingSection('Hello', [ SettingsPayload('Email', 'Normal', () => print('value'), Icons.arrow_forward_ios), SettingsPayload('Notifications', 'Normal', () => print('hello')), ]), ], ), ); } } class SettingSection extends StatelessWidget { final String title; final List<SettingsPayload> payload; SettingSection(this.title, this.payload); @override Widget build(BuildContext context) { return Container( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min, children: <Widget>[ Container( padding: EdgeInsets.only(left: 10.0), height: 25.0, decoration: BoxDecoration( color: Color.fromRGBO(223, 230, 233, 0.5), border: Border( bottom: BorderSide( color: Color.fromRGBO(223, 230, 233, 0.5), width: 1.0))), child: Row(children: <Widget>[ Text( this.title, style: TextStyle(fontSize: 15.0, color: Colors.blueGrey), ) ])), _buildListSettings(context), ], ), ); } Widget _buildListSettings(BuildContext context) { List<Widget> items = List<Widget>(); for (var setting in this.payload) { // TODO: Add logic here to determine what kind of setting widget to // create based on the payload. items.add(ListTile( title: Text(setting.title), trailing: Icon(setting.icon), )); items.add(Divider()); } return Column(children: items); } } class SettingsPayload { final String title; final String type; final Function handler; final IconData icon; SettingsPayload(this.title, this.type, [this.handler, this.icon]); } ,并为每个项目创建ListView.builder小部件。取决于您如何处理数据。