可滚动的抖动弹出菜单

时间:2018-08-02 01:27:51

标签: dart flutter

我正在尝试使用flutter弹出菜单按钮,但似乎无法通过滚动使其变小。

可行吗?还是我使用了错误的小部件来做到这一点?

下面的图片仅供参考,只显示前4/5个项目,然后滚动以显示其余项目!

谢谢!

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以改为创建自己的PopUp Widget

Card包裹在具有特定尺寸的AnimatedContainer和内部的ListView中。

使用StackPositioned小部件将此小部件放置在屏幕上,使其位于顶部的其他元素上方|是的。

class CustomPopup extends StatefulWidget {
  CustomPopup({
    @required this.show,
    @required this.items,
    @required this.builderFunction,
  });

  final bool show;
  final List<dynamic> items;
  final Function(BuildContext context, dynamic item) builderFunction;

  @override
  _CustomPopupState createState() => _CustomPopupState();
}

class _CustomPopupState extends State<CustomPopup> {
  @override
  Widget build(BuildContext context) {
    return Offstage(
      offstage: !widget.show,
      child: AnimatedContainer(
        duration: Duration(milliseconds: 300),
        height: widget.show ? MediaQuery.of(context).size.height / 3 : 0,
        width: MediaQuery.of(context).size.width / 3,
        child: Card(
          elevation: 3,
          child: MediaQuery.removePadding(
            context: context,
            removeTop: true,
            child: ListView.builder(
              scrollDirection: Axis.vertical,
              itemCount: widget.items.length,
              itemBuilder: (context, index) {
                Widget item = widget.builderFunction(
                  context,
                  widget.items[index],
                );
                return item;
              },
            ),
          ),
        ),
      ),
    );
  }
}
return Stack(
      children: <Widget>[
        Container(
          color: Colors.blueAccent,
        ),
        Positioned(
          right: 0, 
          top: 60, 
          child: CustomPopup(
                  show: shouldShow,
                  items: [1, 2, 3, 4, 5, 6, 7, 8],
                  builderFunction: (context, item) {
                    return ListTile(
                       title: Text(item.toString()),
                       onTap: () {}
                    );
                  },
              ),
          ),
      ],
    );

答案 1 :(得分:1)

您可以通过两种方式创建此代码:第一种是PopupMenuButton小部件,第二种是PopupRoute

render

class HomePage extends StatefulWidget {

@override _HomepageState createState()=> _HomepageState(); }

_HomepageState类扩展了状态{

Listitems = [1,2,3,4,5,6,7,8,9,10,11,12,13];

@override 小部件build(BuildContext context){

return Scaffold(body: Center(
  child: PopupMenuButton(
      child: Icon(Icons.add_shopping_cart),
      offset: Offset(-1.0, -220.0),
      elevation: 0,
      color: Colors.transparent,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))),
      itemBuilder: (context) {
        return <PopupMenuEntry<Widget>>[
          PopupMenuItem<Widget>(
            child: Container(
              decoration: ShapeDecoration(
                  color: Colors.white,
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
              child: Scrollbar(
                child: ListView.builder(
                  padding: EdgeInsets.only(top: 20),

                  itemCount: items.length,
                  itemBuilder: (context, index) {
                    final trans = items[index];
                    return ListTile(

                      title: Text(
                        trans.toString(),
                        style: TextStyle(
                          fontSize: 16,

                        ),
                      ),

                      onTap: () {
                        //what would you like to do?
                      },
                    );
                  },
                ),
              ),
              height: 250,
              width: 500,
            ),
          )
        ];
      }),
)

您还可以通过减少或增加容器的高度来调整要显示的项目数。我还添加了一个滚动条,以防万一。