【Flutter学习】AppBar 和 PopupMenu

news2024/11/21 1:34:56

App Bar 可以视为页面的标题栏,在 Flutter 中用AppBar组件实现;Popup Menu 是弹出菜单,用PopupMenuButton实现。下面结合这两个组件说明其用法。

1. 代码实现

一个简单的AppBar实现代码如下:

import 'package:flutter/material.dart';

void main() {
  runApp(const AppBarTest());
}

class AppBarTest extends StatelessWidget {
  const AppBarTest({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('这是 AppBar'),
          actions: [
            IconButton(
              icon: const Icon(Icons.search),
              tooltip: '搜索',
              onPressed: () {
                print('点击了搜索按钮');
              },
            ),
            PopupMenuButton<String>(
              itemBuilder: (context) => <PopupMenuItem<String>>[
                const PopupMenuItem(value: '1',child: Text('T恤')),
                const PopupMenuItem(value: '2',child: Text('外套')),
                const PopupMenuItem(value: '3',child: Text('夹克')),
                const PopupMenuItem(value: '4',child: Text('卫衣')),
              ],
              onSelected: (String item) {
                print('选择了$item');
              },
              elevation: 5,
            ),
          ],
        ),
        body: const Center(
          child: Text('页面内容'),
        ),
      ),
    );
  }
}

Chrome Web 展示效果如下:
在这里插入图片描述
为展示AppBar的功能,我们在通过actions属性添加了两个组件,一个是搜索按钮(IconButton),另一个是弹出菜单(PopupMenuButton)。点击弹出菜单会弹出一个选择项列表:
在这里插入图片描述
PopupMenuButtononSelected方法可以获取选中的菜单值,即PopupMenuItemvalue属性值:

在这里插入图片描述

2. onSelected 方法

PopupMenuButton.onSelected方法在选择了菜单项后调用,其参数为PopupMenuItem.value属性的类型,也即PopupMenuButton的泛型类型。
在这里插入图片描述
因其定义为泛型,故我们可以将任意类型的数据填充为value值。假设我们需要在点击菜单项时获取服装类型的编码(code)和名称(name),我们可以将其定义为对应的类:

class ClothesItem {
  ClothesItem(this.code, this.name);

  String code;
  String name;
}

将服装类型数据定义为ClothesItem的数组:

final clothesItems = [
  ClothesItem('1', 'T恤'),
  ClothesItem('2', '外套'),
  ClothesItem('3', '夹克'),
  ClothesItem('4', '卫衣'),
];

则在可以将 clothesItems 转为 List<PopupMenuItem<ClothesItem>>

List<PopupMenuItem<ClothesItem>> popupMenuItems = clothesItems
  .map((e) => PopupMenuItem<ClothesItem>(
		value: e,
		child: Text(e.name),
	  ))
  .toList();

这样我们就可以将onSelected的参数类型声明为ClothesItem,从而在方法中获取其 code 和 name 值:

onSelected: (ClothesItem item) {
  print('选择了${item.code}:${item.name}');
}

完整代码如下:

import 'package:flutter/material.dart';

void main() {
  runApp(AppBarTest());
}

class ClothesItem {
  ClothesItem(this.code, this.name);

  String code;
  String name;
}

class AppBarTest extends StatelessWidget {
  AppBarTest({Key? key}) : super(key: key);

  final clothesItems = [
    ClothesItem('1', 'T恤'),
    ClothesItem('2', '外套'),
    ClothesItem('3', '夹克'),
    ClothesItem('4', '卫衣'),
  ];

  
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('这是 AppBar'),
          actions: [
            IconButton(
              icon: const Icon(Icons.search),
              tooltip: '搜索',
              onPressed: () {
                print('点击了搜索按钮');
              },
            ),
            PopupMenuButton<ClothesItem>(
              itemBuilder: (_) => clothesItems
                  .map((e) => PopupMenuItem<ClothesItem>(
                        value: e,
                        child: Text(e.name),
                      ))
                  .toList(),
              onSelected: (ClothesItem item) {
                print('选择了${item.code}:${item.name}');
              },
              elevation: 5,
            ),
          ],
        ),
        body: const Center(
          child: Text('页面内容'),
        ),
      ),
    );
  }
}

参考

Flutter 官方示例 gallery

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

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

相关文章

ResNet分类器量化

1. 动态范围的常用计算方法 Max方法 之前的对称量化和非对称量化就是在用最大最小的办法做的 Histgram 直方图是一种用于可视化信号或数据分布的图形工具。计算动态范围的一种方法是通过查看直方图的范围。动态范围可以由直方图中的最高峰值和最低峰值之间的差异来估算。 E…

国内乳业龙头『君乐宝』×企企通强强联手,搭建采购供应链管理系统+商城平台双管齐下推动低碳转型

乳制品含有丰富且易吸收的营养物质&#xff0c;一直以来被认为是改善国民营养健康的重要产品&#xff0c;随着乳制品加工工艺的发展&#xff0c;市场上出现越来越多种类的乳制品供消费者选择。 随着中国经济发展、城镇化水平提高&#xff0c;以及年轻一代饮奶习惯的改变等因素&…

Table.Group系列_第4参数为全局的情况下,利用第5参数进行分组汇总

原始数据: 部门与职位存在于同一列中 实现功能: 根据筛选条件,可对部门或职位进行统计汇总第一列列名根据筛选自动变更,显示当前统计的维度 实现方式: 1. 构建筛选器内容 在任意空白单元格内输入需要筛选的内容 2. 插入"组合框"控件,并进行相应设置 从开发工具…

解决linux5.15编译时不生成boot.img 的问题

平台&#xff1a;rk3399 &#xff08;与平台关系不大&#xff09; 内核 &#xff1a;linux5.15 下一个linux5.15的内核&#xff0c;编译的时候 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j6 rk3399-rock960.img 目标rk3399-rock960.img 需要在arch/arm64/boot/dts…

RK3588camera: AHD摄像头转MIPI转接芯片调试

我们常见的摄像头接口一般有MIPI、USB、DVP等等&#xff0c;但是MIPI摄像头受限于高速信号的传输距离问题&#xff0c;导致走线不能太长&#xff0c;这样在安防监控领域、车载等领域&#xff0c;使用就很受限&#xff0c;因此会引入一些技术延长摄像头的数据传输距离&#xff0…

Pytorch之SwinTransformer图像分类

文章目录 前言一、Swin Transformer1.Swin Transformer概览2.Patch Partition3.Patch Merging4.W-MSA5.SW-MSA(滑动窗口多头注意力机制)6.Relative Position bias(相对位置偏移)7.网络结构&#x1f947;Swin Transformer Block&#x1f948;Architecture 二、网络实现1.构建Eff…

【docker】Docker--harbor私有仓库部署与管理——重点

一、理论 1、本地私有仓库 只能在当前机器上做 #首先下载 registry 镜像 docker pull registry #在 daemon.json 文件中添加私有镜像仓库地址 vim /etc/docker/daemon.json { "insecure-registries": ["192.168.10.23:5000"], …

阿里云r8i内存型服务器ECS实例介绍_CPU性能_网络存储测评

阿里云服务器ECS内存型r8i实例CPU采用第四代Intel Xeon可扩展处理器&#xff08;Sapphire Rapids&#xff09;&#xff0c;基频2.7 GHz&#xff0c;全核睿频3.2 GHz&#xff0c;计算性能稳定&#xff0c;CPU内存比1:8&#xff0c;采用阿里云全新CIPU架构&#xff0c;CPU核心2核…

vue elementui的select组件实现滑到底部分页请求后端接口

vue elementui的select组件实现滑到底部分页请求后端接口 1.实现效果2.实现原理 1.实现效果 老规矩&#xff0c;直接上最后的实现效果 2.实现原理 直接上代码 <el-form-item class"diagmosisItem" label"诊断" v-scroll"handleScroll">…

Spring实战 | Spring IOC不能说的秘密?

国庆中秋特辑系列文章&#xff1a; 国庆中秋特辑&#xff08;八&#xff09;Spring Boot项目如何使用JPA 国庆中秋特辑&#xff08;七&#xff09;Java软件工程师常见20道编程面试题 国庆中秋特辑&#xff08;六&#xff09;大学生常见30道宝藏编程面试题 国庆中秋特辑&…

巧用h2-database.jar连接数据库

文章目录 一 、概述二、实践三、解决办法 一 、概述 H2 Database是一个开源的嵌入式数据库引擎&#xff0c;采用java语言编写&#xff0c;不受平台的限制&#xff0c;同时H2 Database提供了一个十分方便的web控制台用于操作和管理数据库内容。H2 Database还提供兼容模式&#…

hive数据表创建

目录 分隔符 分区表 二级分区 分桶表 外部表 分隔符 CREATE TABLE emp( userid bigint, emp_name array<string>, emp_date map<string,date>, other_info struct<deptname:string, gender:string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t COL…

BN体系理解——类封装复现

from pathlib import Path from typing import Optionalimport torch import torch.nn as nn from torch import Tensorclass BN(nn.Module):def __init__(self,num_features,momentum0.1,eps1e-8):##num_features是通道数"""初始化方法:param num_features:特征…

工业读写器如何选型?

随着工业自动化的迅速发展&#xff0c;库存管理、生产流程、质量管理等传统工作人工工作也逐渐由各种智能设备来替代管理。RFID技术作为非接触式数据传输的通信方式&#xff0c;也常常应用在工业场合之中。具体工业RFID读写器如何选型&#xff0c;有哪些选择要点呢?ANDEAWELL国…

复杂环境下人形机器人自动导航项目复盘

百度飞浆企业赛&#xff1a; 乐聚机器人提供动作工程文件&#xff0c;aelos软件中可修改动作的每个舵机的数值。 Aelos Smart零点设置 MobXterm上通过ssh远程连接树莓派。 1、上下开横杆 横杆一开始是关闭的&#xff0c;横杆打开的那个瞬间&#xff0c;机器人以最快速度通过。…

spring:详解控制反转IOC

文章目录 IOC工厂模式实例基于xml管理Bean基于注解管理Bean常用注解&#xff1a;用于创建对象的常用注解&#xff1a;用于注入数据的常用注解&#xff1a;和生命周期相关的(了解)常用注解&#xff1a;新注解 IOC IOC (Inversion of Control)是Spring的核心概念之一。它是指控制…

智能电表消磁复位怎么回事

随着科技的发展的不断进步&#xff0c;智能电表已经成了家家户户用电管理的左膀右臂。相对于传统电表&#xff0c;智能电表具备远程控制读值、实时监控系统、自动控制系统等服务&#xff0c;不但能有效提高电气安全&#xff0c;还有助于客户节约能源。但是&#xff0c;智能电表…

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型&#xff0c;允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…

Vuex基础使用存取值+异步请求后台

目录 一、Vuex简介 1.1 定义 1.2 Vuex关键概念 1.3 使用Vuex的优势 1.4 Vuex中各个js文件的用途 1.5 Vuex各组件 1.5.1 图解 1.5.2 详解 1.6 变量传值的演变形式 二、Vuex获取值 2.1 安装 2.2 菜单栏 2.3 模块 2.4 引用 三、Vuex改变值 四、Vuex异步&请求后台…

Jmeter性能测试之生成测试报告详解

结构 测试计划 测试计划是顶级的层级⽬录的结构&#xff0c; 那么在这样的⽬录结构中&#xff0c;⾥⾯可以包含很多线程组 线程组 线程组我们可以简单的理解为postman测试⼯具⾥⾯的collection&#xff0c;那么在整体线程组⾥⾯&#xff0c;可以添加很多的测试 ⽤例 简单控…