【问题标题】:Flutter DropdownButton - Add title for separating itemsFlutter DropdownButton - 添加标题以分隔项目
【发布时间】:2020-04-11 03:14:34
【问题描述】:

我正在尝试实现一个DropdownButton,它可以通过标题将特定项目彼此分开(请参阅下图中所需的输出,标题为绿色)

就像在示例中一样,我想将这些绿色标题添加到我现有的 DropdownButton,但没有找到任何东西告诉我如何向 DropdownButton 添加项目以外的东西

我还尝试使用ExpansionTileDropdownButton 切换到ListView,但我想保持DropdownButton 的行为...

是否可以将这些标题添加到DropdownButton items?或者我应该尝试通过其他方式来实现它?我现在卡住了,不知道如何继续

【问题讨论】:

  • 我相信没有 Widget 可以完全满足您的需求。当前可用的 Flutter Widget 是为移动设备创建的,而 DropDown 中的这种标题会占用大量空间并且往往难以使用。我也没有找到任何可用的包来重现这个。您很可能必须自己构建它。

标签: flutter flutter-layout dropdownbutton


【解决方案1】:

在 dartpad 中试试这个代码:

 import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      
      home: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return HomeScreen();
  }
}

class HomeScreen extends StatefulWidget {
  @override
  HomeScreenState createState() => HomeScreenState();
}

class HomeScreenState extends State<HomeScreen> {
  String dropdownValue;
  List<Product> products = [
    Product(name: 'sep1', type: 'sep'),
    Product(name: 'milk', type: 'data'),
    Product(name: 'oil', type: 'data'),
    Product(name: 'sep2', type: 'sep'),
    Product(name: 'suger', type: 'data'),
    Product(name: 'salt', type: 'data'),
    Product(name: 'sep3', type: 'sep'),
    Product(name: 'potatoe', type: 'data'),
    Product(name: 'tomatoe', type: 'data'),
    Product(name: 'apple', type: 'data'),
  ];

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('text')),
      body: Column(
        children: [
          Text('test'),
          Expanded(
            child: DropdownButton<String>(
              value: dropdownValue,
              items: products.map((value) {
                return DropdownMenuItem(
                  value: value.name,
                  child: value.type == 'data'
                      ? Text(value.name)
                      : Divider(
                          color: Colors.red,
                          thickness: 3,
                        ),
                );
              }).toList(),
              onChanged: (newValue) {
                
                setState(() {
                  
                    dropdownValue = newValue;
                  
                });
                print('$newValue $dropdownValue');
                
              },
            ),
          ),
        ],
      ),
    );
  }
}

class Product {
  String name;
  String type;

  Product({this.name, this.type});
}

【讨论】:

  • 感谢您的努力!不错的解决方法,但下拉项目的集成分隔符将非常好!但是自从我问以来已经一年了,我建议这将是实现下拉分隔符的最佳方式......我将标记为答案
  • 希望对你有帮助
  • Flutter 2.5 将enabled 参数添加到DropdownMenuItem。使用它来禁用分隔符,使它们不可点击。
【解决方案2】:

除了 Ali Tenni 的回答,您还可以像这样子类DropdownMenuItem

class DropdownMenuItemSeparator<T> extends DropdownMenuItem<T> {
  DropdownMenuItemSeparator() : super(
    enabled: false,     // As of Flutter 2.5.
    child: Container(), // Trick the assertion.
  ); 

  @override
  Widget build(BuildContext context) {
    return Divider(thickness: 3);
  }
}

这将使分隔符更窄,因为否则默认的build() 会增加一些最小高度。

UPD 2021-09-14 以下不再相关,因为该功能是在 Flutter 2.5 中实现的。上面的代码相应地更新了。

这解决了两个问题之一。不幸的是,第二个也是更大的问题是分隔符仍然可以点击,并且点击会关闭下拉菜单。为了解决这个问题,我向 Flutter 提交了一个功能请求: https://github.com/flutter/flutter/issues/75487

【讨论】:

  • 感谢您的回答和向 Flutter 团队填写功能请求!它希望他们考虑到这一点并添加一个解决方案来制作下拉菜单中的子菜单,这是不可选择的呵呵^^
  • 如何使用它以及DropdownMenuItem onTap、child 等变量怎么样?
猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 2019-07-26
  • 2021-08-03
  • 2018-04-24
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多