mirror of
https://github.com/flutter/flutter.git
synced 2026-02-05 11:19:18 +08:00
fixes [MenuItemButton does not constrain its child](https://github.com/flutter/flutter/issues/129439) fixes [DropdownMenuEntry Text Overflow when width of DropdownMenu is not specified](https://github.com/flutter/flutter/issues/140596) ### Description - This PR continues the fix from https://github.com/flutter/flutter/pull/141314#issuecomment-1945804640 and adds controlled widths for the `MenuBar` children to fix the unbounded width issue which blocked the PR earlier. (Widgets with non-zero flex value cannot be laid out in a horizontal scroll view which is created by `MenuBar` widget) - Added tests coverage. - Added documentation. ### Code sample <details> <summary>expand to view the code sample</summary> ```dart import 'package:flutter/material.dart'; void main() => runApp(const MyApp()); class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { MenuController menuController = MenuController(); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( body: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ DropdownMenu<int>( expandedInsets: EdgeInsets.zero, dropdownMenuEntries: <DropdownMenuEntry<int>>[ DropdownMenuEntry<int>( value: 0, label: 'This is a long text that is multiplied by 10. ' * 10, style: const ButtonStyle( textStyle: MaterialStatePropertyAll( TextStyle(overflow: TextOverflow.ellipsis), ), ), ), ], ), SizedBox( width: 200, child: MenuItemButton( onPressed: () {}, leadingIcon: const Icon(Icons.menu), trailingIcon: const Icon(Icons.arrow_forward_ios), child: const Text( 'This is a very long text that will wrap to the multiple lines.', maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ), // MenuBar( // children: [ // MenuItemButton( // onPressed: () { // }, // child: Text('Short Text Menu'), // ), // MenuItemButton( // onPressed: () {}, // child: Text('Very very very very very long text menu'), // ), // ], // ), ], ), ), ), ); } } ``` </details> ### Before  ### After 