颤动自定义标题下拉列表(材质页面过滤器)

时间:2018-03-07 16:32:38

标签: material-design flutter

按照应用栏“页面过滤器”的概念,我想将DropdownButton作为AppBar的标题。我试过了,但看起来并不好。

https://material.io/guidelines/layout/structure.html#structure-app-bar

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _value = 'one';

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

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new DropdownButton<String>(
          value: _value,
          items: <DropdownMenuItem<String>>[
            new DropdownMenuItem(
              child: new Text('one'),
              value: 'one',
            ),
            new DropdownMenuItem(
              child: new Text('two'),
              value: 'two'
            ),
          ], 
          onChanged: (String value) {
            setState(() => _value = value);
          },)
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              'hello world',
            ),
          ],
        ),
      ),
    );
  }
}

然而它看起来像: ios simulator

由于奇怪的下划线而不遵循上述链接中找到的材料模式...奖励:文本和按钮应为白色。

4 个答案:

答案 0 :(得分:6)

我找到了一些有助于我的情况的内容......小部件DropdownButtonHideUnderlineTheme将有助于控制下拉列表在AppBar

标题中的显示方式
new AppBar(
  title: new Theme(
      child: new DropdownButtonHideUnderline(
      child: new DropdownButton<String>(
        value: _value,
        items: <DropdownMenuItem<String>>[
          new DropdownMenuItem(
            child: new Text('My Page'),
            value: 'one',
          ),
        ], 
        onChanged: (String value) {
          setState(() => _value = value);
        },
      ),
    ), 
    data: new ThemeData.dark(),
  ),
),

然而,现在弹出窗口的背景颜色是黑色以匹配黑暗主题...不确定是否有一种方法让主题不影响实际弹出窗口。

我个人可以忍受弹出窗口的黑色背景颜色......除非有人也可以解决这个问题。

enter image description here enter image description here

答案 1 :(得分:1)

执行以下操作:

appBar: AppBar(
    title: Row(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        DropdownButton(
          value: _selectedItem,
          items: _dropdownMenuItems,
          underline: SizedBox(height: 0,),
          //underline: SizedBox(),
          onChanged: onChangeDropdownItem,
        ),
       ],
      ),
    ),

然后在此处更改下拉菜单的样式:

/// Initialize dropdown menu
List<DropdownMenuItem<String>> buildDropdownMenuItems(List menu) {
List<DropdownMenuItem<String>> items = List();
for (String li in menu) {
  items.add(
    DropdownMenuItem(
      value: li,
      child: SizedBox(
        width: 100, 
        child: Text(li, style:  TextStyle(color: labelColor, fontWeight: 
               FontWeight.bold), 
               textAlign: TextAlign.center, overflow: TextOverflow.ellipsis,),),
    ),
  );
}
return items;

}

答案 2 :(得分:0)

要设置白色菜单,请将data: new Theme.dark()更改为Theme.of(context).copyWith(brightness: Brightness.dark))

然后又出现了另一个问题:菜单是白色的;但是菜单选项也用白色写成,使它们不可读。

经过深入检查后,似乎目前无法在谜语状态下使用不同的字体颜色以及下拉时间集中时选项。 考虑在github

上创建问题

答案 3 :(得分:0)

请将您的代码更改为我在下面提到的代码,此代码可能适用于您的应用。enter image description here,对于错误的图片编辑感到抱歉。我已经提供了完整的代码供您参考,

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyHomePage(),
  ));
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _value = 'one';

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

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
          title:
          new Row(
         mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          new DropdownButton<String>(
            value: _value,
            items: <DropdownMenuItem<String>>[
              new DropdownMenuItem(
                child: new Text('one'),
                value: 'one',
              ),
              new DropdownMenuItem(child: new Text('two'), value: 'two'),
            ],
            onChanged: (String value) {
              setState(() => _value = value);
            },
          ),

        ],
      )
 ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              'hello world',
            ),
          ],
        ),
      ),
    );
  }
}

enter image description here