一尘不染

如何在Flutter ListView Builder中删除或管理空间?

flutter

我是新手,这个问题也可能重复。如果有人可以帮助我找到答案,请问?谢谢您的帮助。

问题:如何在Flutter ListView Builder中删除或管理空间?附件为“侧边菜单”
/“导航抽屉”的照片。我需要的是减少导航项目的高度。换句话说,减少每个项目的顶部和底部间距。
在此处输入图片说明

代码如下:

import 'package:flutter/material.dart';
import '../pages/home_screen.dart';
import '../pages/list_page.dart';
import '../pages/item_page.dart';

final List<MenuItem> menuItems = <MenuItem>[
  MenuItem(0,'Home',Icon(Icons.home),Icon(Icons.chevron_right), HomeScreen()),
  MenuItem(1,'List',Icon(Icons.home),Icon(Icons.chevron_right), ListPage()),
  MenuItem(2,'Item',Icon(Icons.home),Icon(Icons.chevron_right), ItemPage()),
  MenuItem(1,'Home',Icon(Icons.home),Icon(Icons.chevron_right), HomeScreen()),
  MenuItem(1,'List',Icon(Icons.home),Icon(Icons.chevron_right), ListPage()),
  MenuItem(2,'Item',Icon(Icons.home),Icon(Icons.chevron_right), ItemPage()),
  MenuItem(1,'Home',Icon(Icons.home),Icon(Icons.chevron_right), HomeScreen()),
  MenuItem(1,'List',Icon(Icons.home),Icon(Icons.chevron_right), ListPage()),
  MenuItem(2,'Item',Icon(Icons.home),Icon(Icons.chevron_right), ItemPage()),
  MenuItem(2,'Item',Icon(Icons.home),Icon(Icons.chevron_right), ItemPage()),
  MenuItem(1,'Home',Icon(Icons.home),Icon(Icons.chevron_right), HomeScreen()),
  MenuItem(1,'List',Icon(Icons.home),Icon(Icons.chevron_right), ListPage()),
  MenuItem(2,'Item',Icon(Icons.home),Icon(Icons.chevron_right), ItemPage()),
];

class XmobeMenu extends StatelessWidget {
  int indexNumber;
  XmobeMenu(int menuIndex)
  {
    indexNumber =menuIndex;
  }
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return MenuItemWidget(menuItems[index],indexNumber);
        },
        itemCount: menuItems.length,
      ),
    );
  }
}

class MenuItem {
  MenuItem(this.itemNumber,this.title, this.leadIcon, this.trailIcon, this.page);
  final int itemNumber;
  final Icon leadIcon;
  final Icon trailIcon;
  final String title;
  final StatelessWidget page;
}

class MenuItemWidget extends StatelessWidget {
  final MenuItem item;
  final int indexNumber;
  const MenuItemWidget(this.item, this.indexNumber);

  Widget _buildMenu(MenuItem menuItem, context) {
    return
      new Container(
        color: const Color.fromARGB(0, 245,245,245),
        child: new Column(
          children: <Widget>[
            new Column( children: <Widget>[
              Container(
                 padding: new EdgeInsets.all(0.0),
                 child: ListTile(
                    leading: menuItem.leadIcon,
                    title: Text(menuItem.title,),
                    trailing: menuItem.trailIcon,
                    selected: _checkEnabled(menuItem.itemNumber,indexNumber),
                    onTap: () {
                      Navigator.of(context).push(
                        new MaterialPageRoute(
                          builder: (BuildContext context) => menuItem.page,
                        ),
                      );
                    },
                  ),
              ),
              Divider(height: 1.0,color: Colors.grey,),
            ],)
          ],
        ),

      );
  }
  bool _checkEnabled(int itemNumber, int index)
  {
    if(itemNumber==index) {
        return true;
      }
      else
        {
      return false;
    }
  }
  @override
  Widget build(BuildContext context) {
    return _buildMenu(this.item, context);
  }


}

阅读 296

收藏
2020-08-13

共1个答案

一尘不染

您由于 ListTile中的 自动填充而面临此问题。您可以使用 InkwellRow 来达到相同的效果。遵循代码可能会帮助您。

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',
        theme: new ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text("check"),
          ),
          drawer: XmobeMenu(5),
        ),

      );
    }
  }

  final List<MenuItem> menuItems = <MenuItem>[
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
    MenuItem(0,'Home',Icons.home,Icons.chevron_right),
  ];

  class XmobeMenu extends StatelessWidget {
    int indexNumber;
    XmobeMenu(int menuIndex)
    {
      indexNumber =menuIndex;
    }
    @override
    Widget build(BuildContext context) {
      return Drawer(
        child: ListView.builder(
          itemBuilder: (BuildContext context, int index) {
            return MenuItemWidget(menuItems[index],indexNumber);
          },
          itemCount: menuItems.length,
        ),
      );
    }
  }

  class MenuItem {
    MenuItem(this.itemNumber,this.title, this.leadIcon, this.trailIcon,);
    final int itemNumber;
    final IconData leadIcon;
    final IconData trailIcon;
    final String title;
  }

  class MenuItemWidget extends StatelessWidget {
    final MenuItem item;
    final int indexNumber;
    const MenuItemWidget(this.item, this.indexNumber);

    Widget _buildMenu(MenuItem menuItem, context) {
      return InkWell(
          onTap: () {
            Navigator.of(context).push(
              new MaterialPageRoute(
                builder: (BuildContext context) => MyApp(),
              ),
            );
          },
          child: new Container(
            color: const Color.fromARGB(0, 245,245,245),
            child: new Column(
              children: <Widget>[
                new Column( children: <Widget>[
                  Container(
                    padding: new EdgeInsets.all(8.0), // what ever padding you want add here
                    child: Row(
                      children: <Widget>[
                        new Icon(menuItem.leadIcon),
                        new Expanded (
                          child: new Text(menuItem.title),
                        ),
                        new Icon(menuItem.trailIcon),
                      ],
                    )
                  ),
                  Divider(height: 1.0,color: Colors.grey,),
                ],)
              ],
            ),

          ),
        );
    }
    bool _checkEnabled(int itemNumber, int index)
    {
      if(itemNumber==index) {
        return true;
      }
      else
      {
        return false;
      }
    }
    @override
    Widget build(BuildContext context) {
      return _buildMenu(this.item, context);
    }


  }
2020-08-13