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

news2024/12/23 14:58:58

在这里插入图片描述

文章目录

  • 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的精彩世界!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用工具速记

文章目录 一、sqlyoy登录账号信息迁移二、idea导入之前的已配置的idea信息三、设置windows UI大小四、其他 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、sqlyoy登录账号信息迁移 工具(sqlyog上面菜单栏)->导入导出详情->选择要导出的账号…

day03-(docker)

文章目录 DockerDocker和虚拟机的差别docker在linux安装配置镜像命令容器命令介绍Docker-容器&#xff08;基本操作&#xff09;docker基本操作&#xff08;数据卷&#xff09;数据卷挂载直接挂载四.Dockerfile自定义镜像五.Docker-Compose 安装修改权限镜像仓库![在这里插入图…

Vscode上使用Clang,MSVC, MinGW, (Release, Debug)开发c++完全配置教程(包含常见错误),不断更新中.....

1.VSCode报错头文件找不到 clang(pp_file_not_found) 在Fallback Flags中添加 -I&#xff08;是-include的意思&#xff0c;链接你的编译器对应头文件地址&#xff0c;比如我下面的是MSVC的地址&#xff09; 问题得到解决~

Docker基本操作 容器相关命令

docker run:运行镜像; docker pause:暂停容器&#xff0c;会让该容器暂时挂起&#xff1b; docker unpauser:从暂停到运行; docker stop:停止容器&#xff0c;杀死进程; docker start:重新创建进程。 docker ps&#xff1a;查看所有运行的容器及其状态&#xff0c;默认只展…

城市建筑轮廓矢量边界、建设用地数据、城市道路网分布、城市土地利用规划分布、土地利用数据、城市绿地分布

数据下载链接&#xff1a;数据下载链接 中国主要城市建筑底面轮廓和建筑高度空间分布数据&#xff0c;包括省会城市、地级市及县级市等主要城市。城市建筑底面轮廓和建筑高度数据&#xff0c;数据坐标为 WGS84地理坐标&#xff0c; 数据格式为 SHP 文件。数据范围基本覆盖城市…

OceanBase开发者大会实录 - 阳振坤:云时代的数据库

本文来自2024 OceanBase开发者大会&#xff0c;OceanBase 首席科学家阳振坤的演讲实录——《云时代的数据库》。完整视频回看&#xff0c;请点击这里 >> 在去年的开发者大会中&#xff0c;我跟大家分享了我对数据库产品和技术一些看法&#xff0c;包括单机分布式一体化&…

openjudge_2.5基本算法之搜索_200:Solitaire

题目 200:Solitaire 总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left to right resp…

maven-idea新建和导入项目

全局配置 新建项目 需要新建的文件夹 src/testsrc/test/javasrc/main/java 注&#xff1a;1、新建Java-class&#xff0c;输入.com.hello.hellomaven 2、快捷键psvm显示 public static void main(String[] args) {.... } package com.hello;public class hellomaven {publ…

Java-字符集和字符编码-roadmap

1 需求 2 接口 3 示例 4 参考资料 「烫烫屯屯锟斤拷」揭秘ASCII、GBK、UTF-8&#xff0c;B站独家&#xff0c;一听就懂_哔哩哔哩_bilibili 非常详细的字符编码讲解&#xff0c;ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有_哔哩哔哩_bilibili 你懂乱码吗&#xff1f;锟斤…

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务&#xff08;之前是Ribbon——RestTemplate&#xff09; 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

【小梦C嘎嘎——启航篇】C++四大类型转换

&#x1f60e; 前言&#x1f64c;C四大类型转换什么是类型转换C语言中的类型转换为什么C要嫌弃C语言的类型转换&#xff1f;自行搞一套呢&#xff1f;C强制类型转换1、static_cast2、reinterpret_cast3、const_cast4、dynamic_cast为什么要支持向下转呢&#xff1f; RTTI 总结撒…

C++之STL-list+模拟实现

目录 一、list的介绍和基本使用的方法 1.1 list的介绍 1.2 list的基本使用方法 1.2.1 构造方法 1.2.2 迭代器 1.2.3 容量相关的接口 1.2.4 增删查改的相关接口 1.3 关于list迭代器失效的问题 二、模拟实现list 2.1 节点类 2.2 迭代器类 2.3 主类list类 2.3.1 成员变…

yolov8 dll 编译

1. 每次用yolo v8 都要用python &#xff0c;对于我这种写软件的太不方便了&#xff0c;下面尝试编译dll 调用, 我已经有做好的模型.best.pt 参考视频方法: yolov8 TensorRT C 部署_哔哩哔哩_bilibili 【yolov8】tensorrt部署保姆级教程&#xff0c;c版_哔哩哔哩_bilibili 需…

C语言基础知识笔记——万字学习记录

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要参考浙大翁恺老师的C语言讲解以及其他博主的C语言学习笔记&#xff0c;进而梳理C语言的基础知识&#xff0c;为后续系统性学习数据结构和其他语言等知识夯实一定的基础。&#xff08;其他博主学习笔记的链接包括&#x…

陕西省人力资源和社会保障厅 陕西省住房和城乡建设厅 关于开展2023年度全省建设工程专业高级工程师评审工作的通知

陕西工程系列建设工程专业工程师评审工作要求链接陕西省人力资源和社会保障厅 陕西省住房和城乡建设厅 关于开展2023年度全省建设工程专业高级工程师评审工作的通知 - 陕西省住房和城乡建设厅类别基本条件业绩成果备注助理工程师 最新公告http://www.snhrm.com/zxggao2/597358…

怎么排查K8S容器当中的Java程序内存泄露问题

今天早上发现生产线其中的一个服务在凌晨的时候突然重启了&#xff0c;内存突然从1G升到1.8G&#xff0c;CPU使用量从0.1升到了0.28&#xff0c;说明在这个时间点&#xff0c;内存突增达到了限额以上&#xff0c;服务重启了。因为这个服务布署了多节点&#xff0c;这次重启对业…

不同技术实现鼠标滚动图片的放大缩小

摘要&#xff1a; 最近弄PC端的需求时&#xff0c;要求在layui技术下实现鼠标滚动图片的放大缩小的功能&#xff01;下面来总结一下不同框架剩下这功能&#xff01; layui: 看了一下layui文档&#xff0c;其实这有自带的组件的&#xff01;但是又版本要求的!并且layui的官方文档…

element 分页切换时:current-page无效 页数不会跟着一起切换

问题回溯&#xff1a;使用el-pagination组件 选择切换当前分页 页数为2 问题结果&#xff1a;el-pagination组件 当前页切换失败 一直都是 1&#xff0c;接口传参分页数据是2&#xff0c;打印当前分页也是2 解决方案1&#xff1a;使用 current-page参数 .sync 修饰符 解决方案2…

北京车展创新纷呈,移远通信网联赋能

时隔四年&#xff0c;备受瞩目的2024&#xff08;第十八届&#xff09;北京国际汽车展览会于4月25日盛大开幕。在这场汽车行业盛会上&#xff0c;各大主流车企竞相炫技&#xff0c;众多全球首发车、概念车、新能源车在这里汇聚&#xff0c;深刻揭示了汽车产业的最新成果和发展潮…