掌握Flutter底部导航栏:畅游导航之旅

1. 引言

在移动应用开发中,底部导航栏是一种常见且非常实用的用户界面元素。它提供了快速导航至不同功能模块或页面的便捷方式,使用户可以轻松访问应用程序的各个部分。在Flutter中,底部导航栏也是一项强大的功能,开发者可以利用Flutter框架提供的丰富组件和灵活性,轻松实现各种样式和交互效果的底部导航栏。

本文将深入探讨Flutter中底部导航栏的实现方法,从基础的结构搭建到高级功能的应用,带领读者逐步掌握使用Flutter构建底部导航栏的技巧与窍门。我们将介绍如何创建基本的底部导航栏结构,自定义其外观,实现与页面的切换和状态管理,并探索一些高级功能,如徽章、动画效果等。

通过本文的学习,读者将能够熟练运用Flutter框架,设计出符合应用主题和用户体验要求的精美底部导航栏,为移动应用的开发与优化提供强有力的支持。

在这里插入图片描述

2. Flutter底部导航栏概述

在Flutter中,底部导航栏是一种常见的用户界面组件,通常用于展示应用程序的主要功能模块或不同页面的快速导航入口。底部导航栏通常位于屏幕底部,由一组导航项(通常是图标和标签组合)组成,用户可以通过点击不同的导航项来切换应用程序的不同部分。

底部导航栏在移动应用开发中扮演着至关重要的角色,它不仅提供了直观的导航方式,还能够增强用户体验和提升应用的易用性。在Flutter中,开发者可以使用内置的BottomNavigationBar组件轻松创建和定制底部导航栏,同时结合其他Flutter组件和功能实现更丰富的导航体验。

底部导航栏的核心概念包括导航项(Navigation Items)和当前选中项(Selected Item)。导航项是指底部导航栏中的每个单独项目,通常由图标和标签组成,用于表示应用程序的不同功能或页面。而当前选中项则是指用户当前正在查看或操作的导航项,通常以不同的样式或颜色进行突出显示,以便用户清晰地了解自己所处的位置。

在接下来的章节中,我们将深入探讨如何在Flutter中创建和定制底部导航栏,包括基本结构的构建、外观的定制、与页面的切换以及状态管理等方面的内容,帮助读者全面掌握底部导航栏的实现技巧与方法。

3. 创建底部导航栏的基本结构

底部导航栏在Flutter中的创建可以通过两个主要的组件来实现:BottomNavigationBar和BottomNavigationBarItem。在这一节中,我们将介绍如何使用这两个组件来创建底部导航栏的基本结构。

3.1 使用BottomNavigationBar

BottomNavigationBar是Flutter提供的一个内置组件,用于创建底部导航栏。它接受一个items参数,该参数是一个包含BottomNavigationBarItem的列表,每个BottomNavigationBarItem代表底部导航栏的一个导航项。

下面是一个简单的示例,演示了如何使用BottomNavigationBar创建一个具有三个导航项的底部导航栏:

class MyBottomNavigationBar extends StatefulWidget {_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}class _MyBottomNavigationBarState extends State<MyBottomNavigationBar> {int _selectedIndex = 0;void _onItemTapped(int index) {setState(() {_selectedIndex = index;});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: Center(child: Text('Selected Index: $_selectedIndex'),),bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: _selectedIndex,selectedItemColor: Colors.blue,onTap: _onItemTapped,),);}
}

在这个示例中,我们创建了一个StatefulWidget,其中包含一个BottomNavigationBar作为底部导航栏。BottomNavigationBar包含三个导航项,分别是“Home”、“Search”和“Profile”,每个导航项都有一个图标和标签。通过currentIndex属性和onTap回调函数,我们可以实现底部导航栏与页面的切换功能。

3.2 BottomNavigationBarItem

BottomNavigationBarItem是用于定义底部导航栏中每个导航项的组件。它接受一个icon参数和一个label参数,分别用于指定导航项的图标和标签。

下面是一个简单的示例,演示了如何使用BottomNavigationBarItem创建一个导航项:

BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',
)

在这个示例中,我们创建了一个包含“Home”标签和home图标的导航项。您可以根据自己的需求自定义图标和标签,以创建符合应用程序主题和设计风格的底部导航栏。

4. 自定义底部导航栏外观

底部导航栏的外观对于应用程序的整体风格和用户体验至关重要。Flutter提供了丰富的选项,使开发者可以轻松自定义底部导航栏的外观,包括选中项的颜色和图标、背景颜色和形状、导航栏的高度以及图标的大小等。在本节中,我们将介绍如何实现底部导航栏的自定义外观。

4.1 更改选中项颜色和图标

通过设置BottomNavigationBar的selectedItemColor属性,可以更改选中项的颜色。此外,您还可以使用selectedIconTheme属性来自定义选中项的图标主题,包括颜色、大小和样式等。

下面是一个示例,演示了如何更改选中项的颜色和图标:

BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: _selectedIndex,selectedItemColor: Colors.blue, // 更改选中项的颜色selectedIconTheme: IconThemeData(size: 30), // 更改选中项的图标大小onTap: _onItemTapped,
),

4.2 自定义背景颜色和形状

要自定义底部导航栏的背景颜色和形状,您可以使用BottomNavigationBar的backgroundColor属性来指定背景颜色,使用elevation属性来设置阴影效果,还可以使用shape属性来定义导航栏的形状,如圆角矩形等。

下面是一个示例,演示了如何自定义底部导航栏的背景颜色和形状:

BottomNavigationBar(items: <BottomNavigationBarItem>[// 导航项...],currentIndex: _selectedIndex,backgroundColor: Colors.grey[200], // 设置背景颜色elevation: 10, // 设置阴影效果shape: RoundedRectangleBorder( // 设置导航栏形状为圆角矩形borderRadius: BorderRadius.vertical(top: Radius.circular(20),),),onTap: _onItemTapped,
),

4.3 调整导航栏高度和图标大小

要调整底部导航栏的高度,可以使用BottomNavigationBar的fixedHeight属性来指定固定高度,也可以使用BottomNavigationBar的selectedIconTheme属性来调整图标的大小。

下面是一个示例,演示了如何调整底部导航栏的高度和图标大小:

BottomNavigationBar(items: <BottomNavigationBarItem>[// 导航项...],currentIndex: _selectedIndex,selectedIconTheme: IconThemeData(size: 30), // 调整图标大小fixedHeight: 80, // 设置底部导航栏的固定高度onTap: _onItemTapped,
),

通过上述方法,您可以灵活地自定义底部导航栏的外观,以满足应用程序的设计需求和用户体验要求。

5. 底部导航栏与页面切换

底部导航栏不仅是一个用于导航的界面组件,还可以与应用程序的不同页面进行切换,以提供更丰富的用户体验。在Flutter中,实现底部导航栏与页面切换通常有两种常见的方式:使用IndexedStack和利用PageView。本节将分别介绍这两种方式的实现方法。

5.1 使用IndexedStack实现页面切换

IndexedStack是Flutter提供的一个用于显示多个子widget中的一个的组件。它类似于Stack,但是只能显示一个子widget,其子widget的索引由index属性指定。通过将IndexedStack作为底部导航栏的主体部分,可以实现底部导航栏与页面的切换效果。

下面是一个示例,演示了如何使用IndexedStack实现页面切换:

class MyBottomNavigationBar extends StatefulWidget {_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}class _MyBottomNavigationBarState extends State<MyBottomNavigationBar> {int _selectedIndex = 0;void _onItemTapped(int index) {setState(() {_selectedIndex = index;});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: IndexedStack(index: _selectedIndex,children: <Widget>[HomeScreen(),SearchScreen(),ProfileScreen(),],),bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: _selectedIndex,selectedItemColor: Colors.blue,onTap: _onItemTapped,),);}
}

在这个示例中,我们将IndexedStack作为Scaffold的body部分,其子widget包含了三个不同的页面(HomeScreen、SearchScreen和ProfileScreen)。通过设置_bottomNavigationBarState类中的_onItemTapped函数,可以实现底部导航栏与页面的切换效果。

5.2 利用PageView实现页面滑动切换

另一种常见的底部导航栏与页面切换方式是利用Flutter提供的PageView组件,它可以实现页面的滑动切换效果。通过将多个页面放置在一个PageView中,并配合底部导航栏实现页面切换,可以为用户提供更加流畅的导航体验。

下面是一个示例,演示了如何利用PageView实现页面滑动切换:

class MyBottomNavigationBar extends StatefulWidget {_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}class _MyBottomNavigationBarState extends State<MyBottomNavigationBar> {int _selectedIndex = 0;PageController _pageController = PageController();void _onItemTapped(int index) {setState(() {_selectedIndex = index;});_pageController.animateToPage(index,duration: Duration(milliseconds: 300),curve: Curves.ease,);}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: PageView(controller: _pageController,children: <Widget>[HomeScreen(),SearchScreen(),ProfileScreen(),],onPageChanged: (index) {setState(() {_selectedIndex = index;});},),bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: _selectedIndex,selectedItemColor: Colors.blue,onTap: _onItemTapped,),);}
}

在这个示例中,我们使用PageView作为Scaffold的body部分,其子widget包含了三个不同的页面(HomeScreen、SearchScreen和ProfileScreen)。通过设置_bottomNavigationBarState类中的_onItemTapped函数,可以实现底部导航栏与页面的切换效果,并利用PageView的onPageChanged回调函数实现页面切换时的同步更新。

6. 底部导航栏与状态管理

底部导航栏通常需要与应用程序的状态进行交互,例如根据用户的操作更新当前选中的导航项。Flutter提供了多种状态管理方法,其中包括使用Provider和Bloc进行状态管理。在本节中,我们将介绍如何利用这两种方法来实现底部导航栏的状态管理。

6.1 使用Provider进行状态管理

Provider是Flutter生态中最常用的状态管理库之一,它提供了一种简单而强大的方式来管理应用程序的状态,并在不同组件之间进行状态共享。通过将底部导航栏的选中项状态提升至顶层,然后使用Provider在底部导航栏和其他相关组件之间共享状态,可以实现底部导航栏的状态管理。

下面是一个示例,演示了如何使用Provider进行底部导航栏的状态管理:

class NavigationProvider extends ChangeNotifier {int _selectedIndex = 0;int get selectedIndex => _selectedIndex;void setSelectedIndex(int index) {_selectedIndex = index;notifyListeners();}
}class MyBottomNavigationBar extends StatelessWidget {Widget build(BuildContext context) {return ChangeNotifierProvider(create: (_) => NavigationProvider(),child: Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: Consumer<NavigationProvider>(builder: (context, provider, child) {return IndexedStack(index: provider.selectedIndex,children: <Widget>[HomeScreen(),SearchScreen(),ProfileScreen(),],);},),bottomNavigationBar: Consumer<NavigationProvider>(builder: (context, provider, child) {return BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: provider.selectedIndex,selectedItemColor: Colors.blue,onTap: (index) {provider.setSelectedIndex(index);},);},),),);}
}

在这个示例中,我们首先创建了一个NavigationProvider类来管理底部导航栏的选中项状态。然后,我们使用ChangeNotifierProvider将NavigationProvider提供给底部导航栏和相关页面组件,并使用Consumer在这些组件中访问和更新状态。通过这种方式,我们实现了底部导航栏与状态的解耦,使其可以轻松管理和更新导航栏的选中项状态。

6.2 使用Bloc进行状态管理

Bloc是另一个常用的Flutter状态管理库,它基于流(Stream)和事件(Event)的模式来管理应用程序的状态,并提供了一种清晰、可维护的方式来组织和处理复杂的业务逻辑。通过创建一个NavigationBloc来处理底部导航栏的状态,并在需要时向Bloc发送事件来更新状态,可以实现底部导航栏的状态管理。

下面是一个示例,演示了如何使用Bloc进行底部导航栏的状态管理:

class NavigationBloc extends Bloc<int, int> {NavigationBloc() : super(0);Stream<int> mapEventToState(int event) async* {yield event;}
}class MyBottomNavigationBar extends StatelessWidget {final NavigationBloc _navigationBloc = NavigationBloc();Widget build(BuildContext context) {return BlocProvider(create: (_) => _navigationBloc,child: BlocBuilder<NavigationBloc, int>(builder: (context, selectedIndex) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: IndexedStack(index: selectedIndex,children: <Widget>[HomeScreen(),SearchScreen(),ProfileScreen(),],),bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: selectedIndex,selectedItemColor: Colors.blue,onTap: (index) {_navigationBloc.add(index);},),);},),);}void dispose() {_navigationBloc.close();super.dispose();}
}

在这个示例中,我们首先创建了一个NavigationBloc类来处理底部导航栏的状态,它继承自Bloc并定义了一个mapEventToState方法来处理事件。然后,我们使用BlocProvider将NavigationBloc提供给底部导航栏和相关页面组件,并使用BlocBuilder在这些组件中监听和更新状态。通过向Bloc发送事件,我们可以实现底部导航栏的状态管理,并根据需要更新导航栏的选中项状态。

7. 底部导航栏实现高级功能

底部导航栏不仅可以简单地实现基本的导航功能,还可以通过一些高级功能来增强用户体验和提升应用的交互性。在本节中,我们将介绍如何实现底部导航栏的一些高级功能,包括添加徽章、动态更改导航栏项以及实现导航栏的动画效果。

7.1 添加徽章

徽章是一种常用的提示标记,用于向用户展示一些重要信息,例如未读消息数量、新通知等。在底部导航栏中添加徽章可以让用户更快速地了解到某个导航项的状态,从而提升用户体验。

下面是一个示例,演示了如何在底部导航栏中添加徽章:

BottomNavigationBarItem(icon: Stack(children: <Widget>[Icon(Icons.notifications),Positioned(right: 0,child: Container(padding: EdgeInsets.all(2),decoration: BoxDecoration(color: Colors.red,borderRadius: BorderRadius.circular(10),),constraints: BoxConstraints(minWidth: 16,minHeight: 16,),child: Text('5',style: TextStyle(color: Colors.white,fontSize: 10,),textAlign: TextAlign.center,),),),],),label: 'Notifications',
)

在这个示例中,我们将底部导航栏中的一个导航项的图标包裹在一个Stack中,并在图标右上角添加一个Container作为徽章。通过设置Container的背景颜色、圆角和文本内容,我们可以实现不同样式的徽章,并通过动态改变文本内容来实现不同数量的提示。

7.2 动态更改导航栏项

有时候我们需要根据用户的登录状态、权限等动态地更改底部导航栏的内容,例如显示不同的导航项或调整某个导航项的样式。Flutter提供了灵活的方式来实现这一功能,可以根据需要在运行时动态更改底部导航栏的项。

下面是一个示例,演示了如何在运行时动态更改底部导航栏的项:

class MyBottomNavigationBar extends StatefulWidget {_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}class _MyBottomNavigationBarState extends State<MyBottomNavigationBar> {bool _isLoggedIn = false;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: Center(child: Text('Dynamic Content'),),bottomNavigationBar: BottomNavigationBar(items: _isLoggedIn? <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),]: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.login),label: 'Login',),],onTap: (index) {// 处理导航项点击事件},),);}
}

在这个示例中,我们根据用户的登录状态动态选择底部导航栏中显示的导航项。如果用户已登录,则显示“Home”和“Search”导航项;如果用户未登录,则显示“Login”导航项。通过在build方法中根据条件动态设置items属性,我们可以实现在运行时动态更改底部导航栏的内容。

7.3 实现底部导航栏的动画效果

为了提升用户体验,有时候我们还可以为底部导航栏添加一些动画效果,例如切换导航项时的渐变动画、滑动导航栏时的缩放动画等。Flutter提供了丰富的动画支持,可以通过AnimatedContainer、AnimatedOpacity、AnimatedCrossFade等组件来实现各种动画效果。

下面是一个示例,演示了如何为底部导航栏添加渐变动画效果:

class MyBottomNavigationBar extends StatefulWidget {_MyBottomNavigationBarState createState() => _MyBottomNavigationBarState();
}class _MyBottomNavigationBarState extends State<MyBottomNavigationBar> {int _selectedIndex = 0;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Bottom Navigation Bar Example'),),body: Center(child: Text('Selected Index: $_selectedIndex'),),bottomNavigationBar: AnimatedContainer(duration: Duration(milliseconds: 300),color: _selectedIndex == 0 ? Colors.blue : Colors.green, // 添加渐变动画效果child: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],currentIndex: _selectedIndex,selectedItemColor: Colors.white,onTap: (index) {setState(() {_selectedIndex = index;});},),),);}
}

在这个示例中,我们使用AnimatedContainer包裹BottomNavigationBar,通过在build方法中根据当前选中的导航项来动态改变容器的颜色,从而实现了底部导航栏的渐变动画效果。通过调整duration属性的值,可以控制动画的持续时间,实现不同的动画效果。

总结

底部导航栏是移动应用界面设计中常见且重要的组件之一,在Flutter中实现底部导航栏不仅简单易行,而且具有丰富的功能和灵活的定制性。通过本文的介绍,我们对如何使用Flutter构建底部导航栏有了全面的了解。

我们首先介绍了创建底部导航栏的基本结构,包括使用BottomNavigationBar和BottomNavigationBarItem组件来搭建导航栏的基本框架。接着,我们讨论了如何自定义底部导航栏的外观,包括更改选中项的颜色和图标、自定义背景颜色和形状、以及调整导航栏的高度和图标大小等。

在实现底部导航栏与页面切换方面,我们介绍了两种常见的方法:使用IndexedStack和利用PageView。无论是静态页面切换还是动态滑动切换,都可以根据实际需求选择合适的方法来实现。

此外,我们还探讨了如何利用状态管理库(如Provider和Bloc)来管理底部导航栏的状态,以及如何实现一些高级功能,如添加徽章、动态更改导航栏项以及实现动画效果等。

综上所述,通过深入学习和实践,开发者可以轻松地构建出功能强大、外观精美的底部导航栏,为移动应用的用户体验和功能导航提供良好的支持。在实际开发中,建议根据应用的需求和设计风格,灵活选择和组合不同的技术手段,打造出更加优秀的底部导航栏。

作者信息

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寄主机显示器被快递搞坏了怎么办?怎么破?

大家好&#xff0c;我是平泽裕也。 最近&#xff0c;我在社区里看到很多关于开学后弟弟寄来的电脑显示器被快递损坏的帖子。 看到它真的让我感到难过。 如果有人的数码产品被快递损坏了&#xff0c;我会伤心很久。 那么今天就跟大家聊聊寄快递的一些小技巧。 作为一名曾经的…

在scroll-view中使用input,input键盘弹出时,滚动页面,输入框内容会出现错位问题?

解决办法 <view classpages><view><scroll-view scroll-y"{{sysScroll}}" scroll-top"{{scrollTop}}" class"scroll-hei-2 bg-def">...<input bindfocus"onfocus" bindblur"onblur" placeholder&quo…

如何在Apache Arrow中定位与解决问题

如何在apache Arrow定位与解决问题 最近在执行sql时做了一些batch变更&#xff0c;出现了一个 crash问题&#xff0c;底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题&#xff0c;在这篇文章中以实际工作中resize导致crash为例&#xff0c;引出如何…

车载以太网AVB交换机 gptp透明时钟 8口 千兆/百兆可切换 SW1100TR

SW1100车载以太网交换机 一、产品简要分析 8端口千兆和百兆混合车载以太网交换机&#xff0c;其中包含2个通道的1000BASE-T1采用罗森博格H-MTD接口&#xff0c;5通道100BASE-T1泰科MATEnet接口和1个通道1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道交…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境&#xff0c;专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能&#xff0c;被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能&#xff1a; R语言拥有…

入门指南|营销中人工智能生成内容的主要类型 [新数据、示例和技巧]

由于人工智能技术的进步&#xff0c;内容生成不再是一项令人头疼的任务。随着人工智能越来越多地接管手动内容制作任务&#xff0c;营销人员明智的做法是了解现有的不同类型的人工智能生成内容&#xff0c;以及哪些内容从中受益最多。这些工具可以帮助我们制作对您的受众和品牌…

RabbitMQ3.x之四_RabbitMQ角色说明及创建用户与授权

RabbitMQ3.x之四_角色说明及创建用户与授权 文章目录 RabbitMQ3.x之四_角色说明及创建用户与授权1. 访问和授权1. Tags说明2. 命令行示例 2. 管理界面新建用户及访问授权1. 管理界面新建用户2. 管理界面中的授权说明3. guest用户不能远程登录提示 3. 创建用户1. 基本命令2. 实际…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

数据结构——链表(练习题)

大家好&#xff0c;我是小锋我们继续来学习链表。 我们在上一节已经把链表中的单链表讲解完了&#xff0c;大家感觉怎么样我们今天来带大家做一些练习帮助大家巩固所学内容。 1. 删除链表中等于给定值 val 的所有结点 . - 力扣&#xff08;LeetCode&#xff09; 我们大家来分…

网站为什么要选择使用安全加速SCDN?

安全加速SCDN&#xff08;安全内容交付网络&#xff09;是一种网络加速服务&#xff0c;旨在提高网站和应用程序的性能和安全性。它使用专门的技术和基础设施来加速内容传输并保护网站免受网络攻击。 安全加速SCDN可以通过内容缓存、快速传输和动态路由技术来加速网站和应用程…

SpringMVC第一个helloword项目

文章目录 前言一、SpringMVC是什么&#xff1f;二、使用步骤1.引入库2.创建控制层3.创建springmvc.xml4.配置web.xml文件5.编写视图页面 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; SpringMVC 提示&#xff1a;以下是本篇文章正文内容&#xf…

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

Git 命令总览

Git Git 是一个版本控制系统&#xff0c;用于管理项目代码。通过 Git 可以轻松地进行代码的提交、更新和合并&#xff0c;确保项目代码的安全性和稳定性。同时&#xff0c;Git 还提供了丰富的工具和功能&#xff0c;如分支管理、代码审查、版本回退等&#xff0c;帮助开发更好…

大模型 智能体 智能玩具 智能音箱 构建教程 wukong-robot

视频演示 10:27 一、背景 继上文《ChatGPT+小爱音响能擦出什么火花?》可以看出大伙对AI+硬件的结合十分感兴趣,但上文是针对市场智能音响的AI植入,底层是通过轮询拦截,算是hack兼容,虽然官方有提供开发者接口,也免不了有许多局限性(比如得通过特定指令唤醒),不利于我…

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

初级&#xff1a;用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程&#xff0c;游戏和实际应用环境有一定差异&#xff08;工具、操作流程&#xff09;&#xff0c;在…

Unity AI Navigation自动寻路

目录 前言一、Unity中AI Navigation是什么&#xff1f;二、使用步骤1.安装AI Navigation2.创建模型和材质3.编写向目标移动的脚本4.NavMeshLink桥接组件5.NavMeshObstacle组件6.NavMeshModifler组件 三、效果总结 前言 Unity是一款强大的游戏开发引擎&#xff0c;而人工智能&a…

ssm网上订餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目采用线性算法

一、源码特点 ssm 网上订餐管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

移动端开发思考:Uniapp的上位替代选择

文章目录 前言跨平台开发技术需求技术选型uniappFlutterMAUIAvalonia安卓原生 Flutter开发尝试Avalonia开发测试测试项目新建项目代码MainViewMainViewModel 发布/存档 MAUI实战&#xff0c;简单略过打包和Avalonia差不多 总结 前言 作为C# .NET程序员&#xff0c;我有一些移动…