- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍在学习 Flutter,我正在尝试创建一个自定义下拉列表。下面是我的自定义下拉列表,它似乎可以工作并返回选定的值,但我仍然需要有关如何在按下墨水池时显示弹出列表的帮助。另外,我如何传入一个字符串数组来构建/填充弹出列表项。感谢您对此的帮助。
return new Expanded(
flex: 4,
child: new InputDropdownList(
labelText: "Select a value",
valueText: viewModel.selectedValue,
valueStyle: Theme.of(context).inputDecorationTheme.labelStyle,
items: <String>["ValueA", "ValueB", "ValueC", "ValueD"],
onPressed: () {
},
selectedValue: (String value) {
setState(() { viewModel.selectedValue= value; });
},
),
),
class InputDropdownList extends StatelessWidget {
const _InputDropdownList({
Key key,
this.labelText,
this.valueText,
this.valueStyle,
this.items,
this.onPressed,
this.selectedValue }) : super(key: key);
final String labelText;
final String valueText;
final TextStyle valueStyle;
final List<String> items;
final Function() onPressed;
final ValueChanged<String> selectedValue;
@override
Widget build(BuildContext context) {
return new InkWell(
onTap: () {},
child: new InputDecorator(
decoration: new InputDecoration(
labelText: labelText,
),
baseStyle: valueStyle,
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new Text(valueText, style: valueStyle),
new PopupMenuButton<String>(
icon: new Icon(Icons.arrow_drop_down, color: Theme.of(context).brightness == Brightness.light ? Colors.grey.shade700 : Colors.white70),
padding: EdgeInsets.zero,
onSelected: (value) {
selectedValue(value);
},
itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
value: "ValueA",
child: const Text('ValueA')
),
new PopupMenuItem<String>(
value: "ValueB",
child: const Text('ValueB')
),
]
),
],
),
),
);
}
}
最佳答案
所以这里有两个问题:您想使用 List<String>
填充 PopupMenuButton
, 然后点击 InkWell
不会打开弹出菜单。
第一期可以创建一个生成PopupMenuItem List的函数,设置在PopupMenuButton itemBuilder上。
_popupMenuItems() {
var popupMenuItemList = <PopupMenuItem<String>>[];
items.forEach((itemValue) {
popupMenuItemList.add(
PopupMenuItem<String>(value: itemValue, child: Text('$itemValue')));
});
return popupMenuItemList;
}
设置_popupMenuItems()
在 PopupMenuButton itemBuilder 中。
PopupMenuButton<String>(
...
itemBuilder: (BuildContext context) => _popupMenuItems(),
);
至于第二个问题,您提供的示例中的当前设置基础有 InkWell
作为父部件。弹出菜单只能在PopupMenuButton
时显示被点击。通过这种方法,PopupMenuButton
只能在小部件的一小块区域上点击。
InkWell(
child: InputDecorator(
child: Row(
children: <Widget>[
Text(),
PopupMenuButton(),
],
),
),
)
作为解决方案,PopupMenuButton
可以是 InkWell 的父部件。这样一来,单击 PopupMenuButton 中的子项仍应显示弹出菜单。
PopupMenuButton(
child: InkWell(
child: InputDecorator(
child: Row(
children: <Widget>[
Text(),
Icon(),
],
),
),
),
)
请注意,您只能使用 child
或 icon
在 PopupMenuButton
, 不是都。自 icon
不能用,我们可以设置Icon
旁边Text
.
这是一个完整的工作示例。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var selectedValue = 'Default';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: InputDropdownList(
labelText: "Select a value",
valueText: selectedValue,
valueStyle: Theme.of(context).inputDecorationTheme.labelStyle,
items: <String>["ValueA", "ValueB", "ValueC", "ValueD"],
onPressed: () {},
selectedValue: (String value) {
setState(() {
selectedValue = value;
});
},
),
),
);
}
}
class InputDropdownList extends StatelessWidget {
const InputDropdownList(
{Key key,
this.labelText,
this.valueText,
this.valueStyle,
this.items,
this.onPressed,
this.selectedValue})
: super(key: key);
final String labelText;
final String valueText;
final TextStyle valueStyle;
final List<String> items;
final Function() onPressed;
final ValueChanged<String> selectedValue;
_popupMenuItems() {
var popupMenuItemList = <PopupMenuItem<String>>[];
items.forEach((itemValue) {
print('$itemValue');
popupMenuItemList.add(
PopupMenuItem<String>(value: itemValue, child: Text('$itemValue')));
});
return popupMenuItemList;
}
@override
Widget build(BuildContext context) {
return PopupMenuButton<String>(
child: InkWell(
// onTap() function overrides the popup displayed from PopupMenuButton
// onTap: () {
// debugPrint('Inkwell tapped');
// },
child: InputDecorator(
decoration: InputDecoration(
labelText: labelText,
),
baseStyle: valueStyle,
child: Row(
children: [
Text(valueText, style: valueStyle),
Icon(Icons.arrow_drop_down,
color: Theme.of(context).brightness == Brightness.light
? Colors.grey.shade700
: Colors.white70),
],
),
),
),
padding: EdgeInsets.zero,
onSelected: (value) {
selectedValue(value);
},
itemBuilder: (BuildContext context) => _popupMenuItems(),
);
}
}
关于drop-down-menu - 如何在 Flutter 中创建自定义下拉列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50010294/
解释 onCreateOptionsMenu(Menu menu) 和 onPrepareOptionsMenu(Menu menu) 的区别。 最佳答案 onCreateOptionsMenu()
所以我又一次为一些问题而苦苦挣扎。这次是这样的,当我将鼠标悬停在 portfoilio 的下拉菜单上时(当网站处于移动 View 模式时),它只会越过其他元素,我尝试使所有内容相对,删除 float
我正在为移动设备设置新菜单。一切都设置好了,但在我点击任何菜单项后,它并没有关闭菜单和菜单覆盖。 有什么办法解决这个问题吗? 我在下面提供了我的 CSS 和 HTML 代码。 CSS margin
我正在使用 selenium webdriver 为单页 Web 应用程序开发一个 Java 框架,使用以下模式:PageObject、SlowLoadableComponent(责任链)、PageF
我是一个动态创建和选项菜单,选项菜单取决于 onCreate() 阶段创建的数据。 问题在于 onCreateOptionsMenu() 在创建数据之前被调用。有没有办法在onCreate()之后执行
HTML: Portfolio Services About Testimonials Request a Quote CSS: ul#menu li {
我是 extjs 的新手。我想在从 Ext.menu.Menu 选择菜单项时关联一个商店。我正在使用 extjs 4.1.0。我在网上搜索甚至通过 sencha doc 但我找不到任何方法来实现这一目
我正在使用 Bootstrap 3.0.0 制作网站 除了下拉菜单不起作用之外,一切都很好。 在文件的头部,我做出了以下声明: 有什么东西不见了? html 应该是正确的:
我刚刚开始学习 JQuery/JavaScript,我无法弄清楚使用 (".menu") 和 ("menu") 之间的区别以及应该在哪里使用它们? 最佳答案 它是menue,jquery使用css选择
我正在尝试向我的应用程序页面之一添加菜单,但由于某种原因,它没有出现。我使这个特定页面扩展了 AppCompactActivity 并覆盖了 onCreateOptionsMenu(Menu menu
我需要完全控制透视菜单。 我已经侵入平台以禁用上下文菜单: private void disablePerspectiveToolbarMenu() { PerspectiveBarManag
假设我有一个包含一些项目的菜单 (Ext.menu.Menu)。显示菜单时,用户 cat 右键单击它的项目,将显示浏览器上下文菜单(带有“将链接另存为...”等元素)。 如何禁用该浏览器上下文菜单
我有一个按钮,单击后将展开一个菜单项,我希望能够通过 java 脚本控制台以编程方式单击其中一个菜单项。这是我单击按钮所需的内容,但在单击 Ext.menu.Menu 时需要一些帮助 var fire
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 5年前关
在这里,我正在从事 safari 扩展开发。我已经在 safari 浏览器上成功获得了开发者证书。 在这里,我可以在工具栏项上创建菜单和子菜单,但根据我的项目要求,我必须在栏中包含菜单和菜单项。 请建
我正在使用 Java 和 Android Studio。我需要更改操作栏上的图像。我需要做的是根据从远程传感器接收到的读数来更改在操作栏上显示的图像。因此,我无法使用可点击的方法,而是使用一些代码在从
亲爱的..我有一个问题。在 Firebug 展上: $("#menu ul.menu").lavaLamp 不是 menu.js 中的函数 悬停在菜单上不显示。我把这个问题显示出来:
因此,我接到了一项任务,即使用 CSS 为网页创建一个汉堡包式多级菜单。这里的问题是添加一个子菜单,使其成为一个多层次的汉堡包。下面是我到目前为止为汉堡包多级菜单编写的代码片段 body { marg
我正在学习 Android 并遵循简单的相机应用教程。我复制了一段代码,但出现错误,我不确定原因。 我使用的教程是, http://iwearshorts.com/blog/android-devel
我的/About 中有一个包含路线的子菜单。 这个子菜单称为 AboutMenu 并出现在/About 下的所有页面,例如 =>/About/Company 和/About/Info。 练习示例显示
我是一名优秀的程序员,十分优秀!