当前位置: 首页 > news >正文

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍

导航栏在移动应用中扮演着至关重要的角色,它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换,还是复杂的应用导航,导航栏都能够帮助用户快速找到所需内容,提升用户体验和应用的易用性。

在移动应用开发中,通常有两种常见的导航栏类型:底部导航栏(BottomNavigationBar)和自定义导航栏(CustomNavigationRail)。底部导航栏通常位于屏幕底部,以图标和标签的形式展示应用的不同功能或页面,用户可以通过点击不同的图标来切换页面。而自定义导航栏则是一种更加灵活的导航栏形式,可以根据应用的需求自定义布局、样式和交互方式,适用于一些特定场景或者需要更多定制化的应用。

然而,在某些情况下,我们可能需要在应用中灵活切换底部导航栏和自定义导航栏,以满足不同用户群体或特定场景下的需求。例如,在平板电脑或大屏幕设备上,使用自定义导航栏能够更好地利用屏幕空间,提供更丰富的导航和功能;而在手机端,底部导航栏可能更符合用户的使用习惯和操作方式。因此,全局控制底部导航栏和自定义导航栏的需求就变得十分重要。通过在应用中实现全局控制,我们可以根据不同的设备或用户需求动态切换导航栏类型,从而提升应用的灵活性和适用性。接下来,我们将探讨如何实现这一目标。

在这里插入图片描述

2. 底部导航栏与自定义导航栏简介

在移动应用开发中,底部导航栏(BottomNavigationBar)和自定义导航栏(CustomNavigationRail)是两种常见的导航栏形式,它们各具特点并在不同的应用场景下发挥着重要作用。

底部导航栏:

底部导航栏通常位于屏幕底部,以图标和标签的形式展示应用的不同功能或页面。它的特点包括:

  • 简洁直观:底部导航栏的设计简洁直观,用户可以通过点击不同的图标来快速切换页面,易于上手和操作。
  • 易于使用:底部导航栏符合用户的使用习惯和操作方式,使用户能够轻松找到所需功能,提升了应用的易用性。
  • 适用性广泛:底部导航栏适用于各种类型的应用,特别是那些功能较少或页面切换频繁的应用。

自定义导航栏:

自定义导航栏是一种更加灵活的导航栏形式,开发者可以根据应用的需求自定义布局、样式和交互方式。它的特点包括:

  • 灵活定制:自定义导航栏可以根据应用的特定需求进行灵活定制,包括布局、样式、交互方式等,满足不同应用场景的需求。
  • 丰富功能:自定义导航栏可以集成更丰富的功能和交互,如侧边栏、抽屉式导航、手势操作等,提供更多的导航和功能选择。
  • 适用特定场景:自定义导航栏通常适用于一些特定场景或需要更多定制化的应用,如平板电脑、桌面应用等,能够更好地利用屏幕空间和提供更丰富的导航体验。

优缺点分析:

底部导航栏和自定义导航栏各有优缺点,适用于不同的应用场景:

  • 底部导航栏适用于功能简单、页面切换频繁的应用,它简洁直观、易于使用,适合手机端的应用。
  • 自定义导航栏适用于需要定制化导航和丰富功能的应用,如平板电脑、桌面应用等,它灵活定制、功能丰富,能够提供更好的用户体验。

根据应用的实际需求和用户群体,开发者可以选择合适的导航栏形式,或者在不同设备和场景下动态切换导航栏类型,以提升应用的用户体验和适用性。接下来,我们将探讨如何实现全局控制底部导航栏和自定义导航栏的方法。

3. 枚举类型的使用

在Flutter中,枚举类型(Enum)是一种有限的、离散的数据类型,用于表示一组相关的常量值。枚举类型在表示一组可能的选项时非常有用,可以提高代码的可读性和可维护性。

介绍枚举类型及其在Flutter中的应用:

枚举类型是一种由一组命名的常量值组成的数据类型。在Flutter中,枚举类型通常用于表示一组相关的选项或状态,例如不同的导航栏类型、主题模式、状态等。通过使用枚举类型,我们可以更清晰地表达代码的意图,避免使用散乱的数字或字符串来表示选项,提高了代码的可读性和可维护性。

在Flutter中,枚举类型的声明方式如下所示:

enum NavigationType {bottomNavigationBar,customNavigationRail,
}

在上面的示例中,我们定义了一个名为NavigationType的枚举类型,它包含了两个常量值:bottomNavigationBarcustomNavigationRail。这些常量值可以被用作代码中的标识符,并且它们的类型都是NavigationType

定义一个枚举类型来表示导航栏的选择:

在全局控制底部导航栏和自定义导航栏的情景下,我们可以使用枚举类型来表示当前选择使用哪种导航栏。例如,在Flutter应用中,我们可以定义一个枚举类型来表示导航栏的选择,如下所示:

enum NavigationType {bottomNavigationBar,customNavigationRail,
}

然后,我们可以在应用中使用这个枚举类型来控制底部导航栏和自定义导航栏的显示和切换。通过这种方式,我们可以清晰地表达当前使用的导航栏类型,并且可以在代码中方便地引用这些选项。接下来,我们将探讨如何利用枚举类型实现全局控制导航栏的方法。

4. 全局控制方法

在移动应用开发中,有时我们需要根据不同的场景或用户需求来动态切换导航栏类型,以提供更好的用户体验。全局控制导航栏的目的是让开发者能够在应用的整个生命周期内灵活地选择和切换导航栏类型,从而满足不同设备、屏幕尺寸或用户需求下的导航需求。

讨论全局控制导航栏的需求和方法:

全局控制导航栏的需求通常包括:

  • 根据设备类型切换导航栏:例如,在手机端使用底部导航栏,在平板电脑或桌面端使用自定义导航栏。
  • 根据用户偏好切换导航栏:例如,提供一个设置选项,让用户自由选择喜欢的导航栏类型。

为了实现全局控制导航栏,我们可以借助枚举类型来表示不同的导航栏类型,并在应用的各个部分使用这个枚举类型来决定当前显示的导航栏。通过这种方式,我们可以轻松地切换导航栏类型,而不需要修改大量的代码。

介绍如何使用枚举类型来控制显示不同的导航栏:

首先,我们需要定义一个枚举类型来表示导航栏的选择,如下所示:

enum NavigationType {bottomNavigationBar,customNavigationRail,
}

然后,在应用的各个部分,我们可以根据这个枚举类型来决定当前显示的导航栏。例如,在build方法中根据枚举类型选择显示底部导航栏还是自定义导航栏:

Widget build(BuildContext context) {// 根据枚举类型选择显示不同的导航栏Widget navigationBar;switch (navigationType) {case NavigationType.bottomNavigationBar:navigationBar = BottomNavigationBar(...);break;case NavigationType.customNavigationRail:navigationBar = CustomNavigationRail(...);break;}return Scaffold(...bottomNavigationBar: navigationBar,...);
}

通过这种方式,我们可以在应用的任何地方轻松地切换导航栏类型,并且保持代码的简洁和可维护性。这样的全局控制方法使得应用的导航栏更加灵活,能够更好地适应不同的用户需求和设备环境。

5. 应用案例

在这个应用案例中,我们将展示如何在一个 Flutter 应用中实现全局控制导航栏,根据用户的偏好动态切换底部导航栏和自定义导航栏。假设我们的应用是一个新闻阅读应用,用户可以选择使用底部导航栏或者自定义导航栏来浏览新闻内容。

场景描述:

  • 当用户首次打开应用时,默认使用底部导航栏来显示新闻分类。
  • 应用提供一个设置页面,用户可以在设置页面中选择使用底部导航栏或者自定义导航栏来浏览新闻。

实现步骤:

  1. 定义枚举类型 NavigationType 来表示导航栏的选择。
  2. 在应用的根部件中,使用 NavigationType 来决定当前显示的导航栏类型。
  3. 在设置页面中,提供一个开关按钮或者下拉菜单,让用户选择喜欢的导航栏类型。
  4. 根据用户的选择,更新应用中的导航栏类型,并重新构建应用以应用新的设置。

示例代码:

import 'package:flutter/material.dart';// 定义枚举类型
enum NavigationType {bottomNavigationBar,customNavigationRail,
}void main() {runApp(MyApp());
}class MyApp extends StatefulWidget {_MyAppState createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {// 默认使用底部导航栏NavigationType _navigationType = NavigationType.bottomNavigationBar;Widget build(BuildContext context) {return MaterialApp(title: 'Navigation Control Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: Scaffold(appBar: AppBar(title: Text('News App'),),body: Center(child: Text('News Content'),),bottomNavigationBar: _buildNavigationBar(),),);}// 根据枚举类型选择显示不同的导航栏Widget _buildNavigationBar() {switch (_navigationType) {case NavigationType.bottomNavigationBar:return BottomNavigationBar(items: const <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.category),label: 'Categories',),BottomNavigationBarItem(icon: Icon(Icons.bookmark),label: 'Bookmarks',),],currentIndex: 0,selectedItemColor: Colors.blue,onTap: (index) {},);case NavigationType.customNavigationRail:return CustomNavigationRail(selectedIndex: 0,onDestinationSelected: (index) {},);}}
}// 自定义导航栏组件
class CustomNavigationRail extends StatelessWidget {final int selectedIndex;final Function(int) onDestinationSelected;CustomNavigationRail({required this.selectedIndex,required this.onDestinationSelected,});Widget build(BuildContext context) {// 自定义导航栏的实现return Container(width: 80,color: Colors.grey[200],child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[IconButton(icon: Icon(Icons.home),onPressed: () {},),IconButton(icon: Icon(Icons.category),onPressed: () {},),IconButton(icon: Icon(Icons.bookmark),onPressed: () {},),],),);}
}

在这个示例中,我们通过定义枚举类型 NavigationType 来表示底部导航栏和自定义导航栏两种选择。根据用户的选择,我们在应用的根部件中选择显示不同类型的导航栏,并且在设置页面中让用户选择喜欢的导航栏类型。通过这样的全局控制方法,我们可以实现根据用户偏好动态切换导航栏类型的功能,提供更好的用户体验。

6. 代码实现

在这一部分,我们将展示如何在 Flutter 中实现全局控制导航栏,并给出详细的代码示例和解释。

示例代码:

import 'package:flutter/material.dart';// 定义枚举类型
enum NavigationType {bottomNavigationBar,customNavigationRail,
}void main() {runApp(MyApp());
}class MyApp extends StatefulWidget {_MyAppState createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {// 默认使用底部导航栏NavigationType _navigationType = NavigationType.bottomNavigationBar;Widget build(BuildContext context) {return MaterialApp(title: 'Navigation Control Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: Scaffold(appBar: AppBar(title: Text('Navigation Control Demo'),),body: Center(child: Text('Current Navigation Type: $_navigationType',style: TextStyle(fontSize: 18),),),bottomNavigationBar: _buildNavigationBar(),floatingActionButton: FloatingActionButton(onPressed: () {// 切换导航栏类型setState(() {_navigationType = _navigationType == NavigationType.bottomNavigationBar? NavigationType.customNavigationRail: NavigationType.bottomNavigationBar;});},child: Icon(Icons.swap_horizontal_circle),),),);}// 根据枚举类型选择显示不同的导航栏Widget _buildNavigationBar() {switch (_navigationType) {case NavigationType.bottomNavigationBar:return BottomNavigationBar(items: const <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.category),label: 'Categories',),BottomNavigationBarItem(icon: Icon(Icons.bookmark),label: 'Bookmarks',),],currentIndex: 0,selectedItemColor: Colors.blue,onTap: (index) {},);case NavigationType.customNavigationRail:return CustomNavigationRail(selectedIndex: 0,onDestinationSelected: (index) {},);}}
}// 自定义导航栏组件
class CustomNavigationRail extends StatelessWidget {final int selectedIndex;final Function(int) onDestinationSelected;CustomNavigationRail({required this.selectedIndex,required this.onDestinationSelected,});Widget build(BuildContext context) {// 自定义导航栏的实现return Container(width: 80,color: Colors.grey[200],child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[IconButton(icon: Icon(Icons.home),onPressed: () {},),IconButton(icon: Icon(Icons.category),onPressed: () {},),IconButton(icon: Icon(Icons.bookmark),onPressed: () {},),],),);}
}

代码解释:

  1. 首先,我们定义了一个枚举类型 NavigationType 来表示底部导航栏和自定义导航栏两种选择。

  2. MyApp 类的状态中,我们维护了一个 _navigationType 变量来表示当前选择的导航栏类型,默认为底部导航栏。

  3. build 方法中,我们根据 _navigationType 的值选择显示不同类型的导航栏,并且在底部导航栏上添加了一个浮动动作按钮,点击按钮可以切换导航栏类型。

  4. 底部导航栏和自定义导航栏分别在 _buildNavigationBar 方法和 CustomNavigationRail 类中实现,并且根据 _navigationType 的值进行切换。

通过这样的代码实现,我们可以在 Flutter 应用中实现全局控制导航栏的功能,根据用户的偏好动态切换导航栏类型,提供更好的用户体验。

7. 总结

在本文中,我们讨论了在 Flutter 应用中实现全局控制导航栏的方法。通过使用枚举类型和条件判断,我们可以轻松地根据用户的偏好动态切换底部导航栏和自定义导航栏,从而提供更好的用户体验。以下是本文的主要总结:

  1. 全局控制导航栏的需求: 在某些场景下,用户可能希望能够根据自己的偏好选择使用底部导航栏还是自定义导航栏。因此,实现全局控制导航栏可以提高应用的灵活性和适用性。

  2. 方法概述: 我们使用枚举类型来表示不同的导航栏类型,并在应用的根部件中根据用户的选择动态切换导航栏。通过在 build 方法中根据枚举类型选择不同的导航栏实现,我们可以轻松地控制导航栏的显示。

  3. 代码实现: 我们展示了一个完整的代码示例,演示了如何在 Flutter 应用中实现全局控制导航栏的功能。通过定义枚举类型、状态管理和条件判断,我们可以根据用户的选择显示不同类型的导航栏,并且提供一个浮动按钮来切换导航栏类型。

综上所述,实现全局控制导航栏是一个简单而有效的方法,可以根据用户的偏好提供个性化的导航体验,增强应用的用户友好性和适用性。通过合理地设计和实现导航栏控制逻辑,我们可以为用户带来更加愉快和便捷的应用体验。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色&#xff0c;它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换&#xff0c;还是复杂的应用导航&#xff0c;导航栏都能够帮助用户快速找到所需内容&#xff0c;提升用户体验和应用的易用性。 在移动应用…...

检索增强生成(RAG)技术:实现流程、作用及应用案例

一. RAG简介 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术巧妙地结合了信息检索与神经网络生成模型的力量&#xff0c;通过在生成过程中引入相关的外部信息&#xff0c;实现了在…...

Ubuntu安装和使用

Ubuntu 安装和配置 修改下载源 打开软件与更新, 选择其它站点, 选择中国, 选择阿里云源 谷歌中文输入法配置 Ctrl Alt T打开终端, 执行下述命令下fcitx框架 输入密码进行安装 sudo apt-get install -y fcitx-googlepinyinWin呼出菜单, 选择语言支持, 第一次打开会显示语言…...

【Unity】Stream最好用的Selfhost开源轻量服务

【背景】 有好几种场景的投屏或者远控应用希望实现&#xff0c;无论用哪种方式&#xff0c;都绕不开如何构建服务这一关。 【分析】 外网有很多直接付费使用的信令传输类型或是提供流服务的服务器&#xff0c;但我的目标场景是断绝外网的局域网&#xff0c;而且付费也总觉得…...

Web 常见的攻击方式有哪些?

常见的 Web 攻击方式有以下几种&#xff1a; 跨站脚本攻击&#xff08;XSS 攻击&#xff09; 跨站请求伪造&#xff08;XSRF 攻击&#xff09; SQL 注入 XSS 攻击 MDN 定义如下&#xff1a; 跨站脚本攻击&#xff08;Cross-site scripting&#xff0c;XSS&#xff09;是一…...

Rancher(v2.6.3)——Rancher部署Redis(单机版)

Rancher部署Redis详细说明文档]&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#6rancher%E9%83%A8%E7%BD%B2redis ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#…...

stm32-模拟数字转化器ADC

接线图&#xff1a; #include "stm32f10x.h" // Device header//1: 开启RCC时钟&#xff0c;包括ADC和GPIO的时钟//2&#xff1a;配置GPIO将GPIO配置为模拟输入模式//3&#xff1a;配置多路开关将左边的通道接入到规则组中//4&#xff1a;配置ADC转…...

[Repo Git] manifests的写法

​manifests​​是个啥 在Repo​中manifests​描述了Repo客户端的结构&#xff0c;也就是可以从manifests​中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 ​manifests​的基本结构是一个Git存储库&#xff0c;在顶层目录中持有一个default.xml​文件。 由于m…...

位置编码与长度外推

位置编码 位置编码从前到后包括:绝对位置编码、余弦位置编码、旋转位置编码、ALiBi相对位置编码。 1 绝对位置编码(Absolute Positional Encoding) 应用的模型:BERT、GPT等Transformer基础模型广泛使用绝对位置编码来处理序列数据。 算法思想:绝对位置编码通过为序列中的…...

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…...

Vue3 中应该使用 Ref 还是 Reactive?

一、引言 在Vue 3中&#xff0c;构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时&#xff0c;我们有两个主要工具&#xff1a;reactive和ref。选择使用哪一个&#xff0c;实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...

前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】

目录 1、图片懒加载 步骤一&#xff1a;自定义全局指令 步骤二&#xff1a;代码中使用 ​编辑步骤三&#xff1a;效果查看 步骤四&#xff1a;代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug&#xff1a;需要…...

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构&#xff08;字段&#xff09; 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL&#xff1a;数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...

c#关键字 static

static 修饰符可用于声明 static 类。 在类、接口和结构中&#xff0c;可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本&#xff0c;但每个 static 字段只有一个副…...

redis 如何保证数据同步(数据变化时)

redis 如何保证数据同步&#xff08;数据变化时&#xff09; 思路 1.新增、删除和修改都先对数据库进行操作&#xff0c;这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后&#xff0c;返回结果&#xff0c;根据返回的结果判断数据库操作是否成功。 3.如果数据库操…...

Ubuntu18.04桌面版设置静态IP地址

引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置&#xff0c;可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框&#xff0c;点击“设置”按…...

Aztec的客户端证明

1. 引言 隐私保护 zk-rollup 的证明生成与通用 zk-rollup 的证明生成有很大不同。原因是给定交易中存在特定数据&#xff08;由私有函数处理&#xff09;&#xff0c;我们希望保持完全私有。在本文中&#xff0c;我们探讨了用于证明私有函数正确执行的客户端证明生成&#xff…...

面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!

写在开头 面试官&#xff1a;小伙子&#xff0c;多线程中锁用过吗&#xff1f; 我&#xff1a;那是自然&#xff01; 面试官&#xff1a;那你知道synchronized的优化吗&#xff1f; 我&#xff1a;synchronized作为重锁&#xff0c;开销大&#xff0c;在早期不被推荐使用&…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...