Flutter应用下拉菜单设计DropdownButtonFormField控件介绍

在这里插入图片描述

文章目录

  • DropdownButtonFormField介绍
  • 使用方法
    • 重点代码说明
    • 属性解释
  • 注意事项

DropdownButtonFormField介绍

Flutter 中的 DropdownButtonFormField 是一个用于在表单中选择下拉菜单的控件。它是 DropdownButton 和 TextFormField 的组合,允许用户从一组选项中选择一个值,并将所选值作为表单字段的值。

使用方法

要使用 DropdownButtonFormField,首先需要在 Flutter 项目中添加 flutter/material.dart 包,然后在需要的地方导入它。

import 'package:flutter/material.dart';

然后,在 Flutter 组件中使用 DropdownButtonFormField。以下是一个简单示例:

import 'package:flutter/material.dart';

class MusicSettingsPage extends StatefulWidget {
  const MusicSettingsPage({Key? key}) : super(key: key);
  
  _MusicSettingsPageState createState() => _MusicSettingsPageState();
}

class _MusicSettingsPageState extends State<MusicSettingsPage> {
  // 存储每个音乐类型的选择
  String _selectedExerciseMusic = '默认音乐';
  String _selectedRestMusic = '默认音乐';
  String _selectedFinishMusic = '默认音乐';

  // 可选音乐列表
  List<String> _exerciseMusics = ['默认音乐', '音乐1', '音乐2', '音乐3'];
  List<String> _restMusics = ['默认音乐', '音乐1', '音乐2', '音乐3'];
  List<String> _finishMusics = ['默认音乐', '音乐1', '音乐2', '音乐3'];

  // 下拉菜单更新选择
  void _updateExerciseMusic(String? value) {
    setState(() {
      _selectedExerciseMusic = value ?? '默认音乐';
    });
  }

  void _updateRestMusic(String? value) {
    setState(() {
      _selectedRestMusic = value ?? '默认音乐';
    });
  }

  void _updateFinishMusic(String? value) {
    setState(() {
      _selectedFinishMusic = value ?? '默认音乐';
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('音乐设置'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            // 运动音乐选择
            DropdownButtonFormField<String>(
              value: _selectedExerciseMusic,
              items: _exerciseMusics.map((String music) {
                return DropdownMenuItem<String>(
                  value: music,
                  child: Text(music),
                );
              }).toList(),
              onChanged: _updateExerciseMusic,
              decoration: InputDecoration(
                labelText: '运动音乐',
              ),
            ),
            SizedBox(height: 16.0),

            // 休息音乐选择
            DropdownButtonFormField<String>(
              value: _selectedRestMusic,
              items: _restMusics.map((String music) {
                return DropdownMenuItem<String>(
                  value: music,
                  child: Text(music),
                );
              }).toList(),
              onChanged: _updateRestMusic,
              decoration: InputDecoration(
                labelText: '休息音乐',
              ),
            ),
            SizedBox(height: 16.0),

            // 结束音乐选择
            DropdownButtonFormField<String>(
              value: _selectedFinishMusic,
              items: _finishMusics.map((String music) {
                return DropdownMenuItem<String>(
                  value: music,
                  child: Text(music),
                );
              }).toList(),
              onChanged: _updateFinishMusic,
              decoration: InputDecoration(
                labelText: '结束音乐',
              ),
            ),
          ],
        ),
      ),
    );
  }
}

重点代码说明

              items: _exerciseMusics.map((String music) {
                return DropdownMenuItem<String>(
                  value: music,
                  child: Text(music),
                );
              }).toList(),

这段代码是使用 _exerciseMusics 列表中的元素来生成 DropdownMenuItem 列表,用于填充 DropdownButtonFormField 的下拉菜单选项。

_exerciseMusics.map((String music) { … }):
这里使用了列表 _exerciseMusics 的 map 方法。map 方法会将列表中的每个元素都映射为另一个值,返回一个新的迭代器。
(String music) 是一个参数,表示 map 方法中的每个元素都会作为 music 变量传递给后续的函数。

return DropdownMenuItem<String>(value: music, child: Text(music),):

在 map 方法的每次迭代中,针对列表中的每个 music 元素,会生成一个 DropdownMenuItem 对象。
value: music:这里将 DropdownMenuItem 的 value 属性设置为当前音乐元素的值。在用户选择此选项时,DropdownButtonFormField 将使用这个值。
child: Text(music):这里将 DropdownMenuItem 的 child 属性设置为一个 Text 组件,显示当前音乐元素的文本内容。
.toList():
map 方法返回一个迭代器,通过调用 .toList(),将迭代器转换为一个新的列表。
这个新的列表包含了 DropdownMenuItem 对象,每个对象都代表了 _exerciseMusics 列表中的一个元素对应的下拉菜单选项。
因此,整个代码段的作用是将 _exerciseMusics 列表中的每个音乐元素转换为 DropdownMenuItem 对象,这些对象构成了一个 `List

,可以用作 DropdownButtonFormField的items` 属性,用于显示下拉菜单中的选项。

属性解释

value: 当前选定的值。在组件初始化时,可以将其设置为表单字段的初始值。
items: 下拉菜单中显示的选项列表。这是一个 List <String>,每个元素都是一个 DropdownMenuItem<String> 对象,包含一个值和显示在下拉菜单中的文本部分。

onChanged: 当用户选择新值时触发的回调函数。可以在这里更新 value,以便在用户进行更改时更新表单字段的值。
decoration: 用于设置表单字段的装饰,比如添加标签文本、边框等。

注意事项

DropdownButtonFormField 可以嵌套在 Form 中,这样可以与其他表单字段一起使用,并且可以利用表单验证功能。
如果希望在选择列表中显示更复杂的项目,可以使用自定义 DropdownMenuItem。
可以根据需要设置 icon、iconSize、isExpanded 等属性来定制下拉菜单的外观和行为。
这是一个基本的 DropdownButtonFormField 示例,可以根据需要对其进行定制和扩展,以满足特定的应用程序需求和设计准则。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/575730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全域外卖城市合伙人怎么样啊?一文解答

全域外卖城市合伙人&#xff0c;也叫做全域外卖服务商&#xff0c;这一职业在当今数字化时代愈发显得重要。它与传统团购外卖服务商的区别&#xff0c;就如同广袤的星空与单一的星星。全域外卖服务商&#xff0c;顾名思义&#xff0c;就是能够涉足所有外卖领域的服务商。这些领…

Python数据爬取超简单入门

## 什么是网络爬虫&#xff1f; 网络爬虫是一种自动浏览器程序&#xff0c;能够自动地从互联网获取数据。爬虫的主要任务是访问网页&#xff0c;分析网页内容&#xff0c;然后提取所需的信息。爬虫广泛应用于数据收集、数据分析、网页内容监控等领域。 ## 爬虫的基本步骤 1.…

前端开发攻略---用原生JS在网页中也能实现文本转语音

1、原理 语音合成 (也被称作是文本转为语音&#xff0c;英语简写是 tts) 包括接收 app 中需要语音合成的文本&#xff0c;再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis&#xff0c;外加一些处理如何表示要被合成的文本 (也被称为 utte…

学习随手记ComboBoxEx选定项的值value和text值获取方法

代码&#xff1a;dotNetBar2中的ComboxBoxEx的使用方法 //获取选定项的value值 string _v ((DevComponents.Editors.ComboItem)cbo_cmdType.SelectedItem).Value.ToString(); //获取选定项的text值 string _t ((DevComponents.Editors.ComboItem)cbo_cmdType.SelectedItem)…

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构&#xff0c;它提供了类似于 SQL 的查询语言&#xff0c;称为 HiveQL&#xff0c;用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Jav…

Java关键字super解释

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们来聊聊Java中super关键字~ 1. 引言 1.1 介绍Java中的关键字 Java是一种强…

SpringCloud 之 服务提供者

前提 便于理解,我修改了本地域名》这里!!! 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.com学习Rest实例之提供者 提供者模块展示 1、导入依赖 <!-- 实体类 Web--><dependency><groupId>com.jyl</groupId><…

HarmonyOS实战开发-如何在鸿蒙开发中使用数据库

鸿蒙中的数据库基于SQLite组件&#xff0c;用来处理关系比较复杂的数据&#xff0c;本文将以WORKER表为例&#xff0c;为大家演示在鸿蒙开发中对数据库的增删改查操作。 1、首先导入数据库模块&#xff1a; import relationalStore from ohos.data.relationalStore;2、配置数…

独家定制,个性至上——可道云TeamOS企业网盘,为您的企业量身定制

烦恼买了企业网盘&#xff0c;却不能修改网盘名称&#xff1f;想要将网盘的logo换成公司的logo&#xff1f; 市面上的大多数公有云盘就是标准化产品&#xff0c;无法改变企业网盘的既定样式、增删功能、也难以根据企业的实际需求灵活变通。 特别是当今企业应用的办公软件比较…

jmeter安装和简单使用

jmeter安装和简单使用 1. 安装 jmeter是基于Java开发的测试应用&#xff0c;其运行依赖于java环境&#xff0c;所以在下载运行jmeter前&#xff0c;先确保本机已经安装jdk或者jre&#xff0c;安装jdk步骤此处不描述。 下载jmeter&#xff1a; jmeter是Apache旗下的产品&…

Fluent.Ribbon创建Office的RibbonWindow菜单

链接&#xff1a; Fluent.Ribbon文档 优势&#xff1a; 1. 可以创建类似Office办公软件的复杂窗口&#xff1b; 2. 可以应用自定义主题风格界面

【redis】非关系型数据库——Redis介绍与安装(windows环境)

目录 数据库架构的演化单体架构缓存(Memcached)MySQL集群缓存(Memcached可以)MySQL集群垂直拆分&#xff08;主从复制&#xff0c;读写分离&#xff09;缓存(Redis)MySQL集群垂直拆分分库分表 NoSQLNoSQL产生的背景性能需求MySQL的扩展性瓶颈方面什么是NoSQLNoSQL的特点主流的N…

李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!

近日&#xff0c;百度创始人、董事长兼首席执行官李彦宏在央视《对话》•开年说的访谈中指出&#xff1a;“基本上说以后其实不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 “未来的编程语言只会剩下两种&#xff0c;一种…

超潜力 JAM 链何以超越中继链,引领 Polkadot 2.0 新航向?

2024 年 4 月 18 日&#xff0c;Polkadot 创始人 Gavin Wood 在迪拜 Token 2049 活动上宣布了一项波卡生态的重大进展—— JAM 灰皮书发布&#xff01;JAM 协议的诞生与发展开辟了波卡生态的另一种发展路径&#xff0c;它将替代当前中继链的技术角色&#xff0c;以模块化、简约…

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…

场内股票期权和场外期权(附场内期权交易攻略)

期权是交易双方关于未来买卖权利达成的合约。 就股票期权来说&#xff0c;期权的买方(权利方)通过向卖方(义务方)支付一定的费用(即期权费或权利金)&#xff0c;获得一种权利&#xff0c;即有权在约定的时间以约定的价格向期权卖方买入或卖出约定数量的标的股票或ETF。 买方(…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

ChatGPT全方位指导:学术论文写作从零开始,轻松搞定高质量论文!

目录 文末福利 一、论文选题的深度探讨 二、撰写摘要的艺术 三、关键词的精选 四、引言的构建 五、正文的结构设计 六、撰写结论的策略 七、致谢的编写 八、附录的有效利用 九、参考文献的整理 文末有福利哦 撰写一篇高质量的学术论文是一项既复杂又耗时的任务。这个…

13-Makefile_04

使用函数 在更复杂的工程中&#xff0c;头文件、源文件可能会放在二级目录&#xff0c;为了实现这种操作通常需要使用Makefile的函数。 函数格式及示例 在Makefile中调用函数的方法跟变量的使用类似&#xff0c;以“$()”或“${}”符号包含函数名和参数&#xff0c;具体语法…

微信搜一搜优化:今天你“搜一搜”了吗?

微信“搜一搜”功能的排名规则和机制是微信生态系统中非常重要的一部分&#xff0c;它决定了小程序、公众号、文章、直播等内容在搜索结果中的展示顺序。小柚给大家整理了一份对其排名规则和机制的详细解析&#xff1a; 首先&#xff0c;关键词匹配度是影响搜索结果排名的重要…