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

Flutter路由

路由作为一种页面切换的能力,非常重要。Flutter 中路由管理有几个重要的点。

Navigator 1.0:Flutter 早期路由系统,侧重于移动端 ,命令式编程风格,使用 Navigator.push() 和 Navigator.pop() 等方法来管理路由栈。

Navigator 2.0:Flutter1.22 版本以后新增,侧重于桌面端/网页端,声明式编程风格,使用 Router 和 RouteInformationParser 等类来描述和管理路由树。

Flutter路由重要的类

1.Route:应用程序页面的抽象, Navigator 管理 Route。

2.Navigator:负责路由管理的重要类,通过 push 和 pop 进行页面跳转。

Flutter 跳转方式

动态路由

适于单次导航的场景,直接在代码中创建和导航的路由。

Navigator.push(context,MaterialPageRoute(builder: (context) => RouterPageA()));

   Navigator.pop(context);
import 'package:flutter/material.dart';import 'dart_test_router1.dart';class TestRouterPage extends StatelessWidget {const TestRouterPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test Navigator"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("Test MaterialPageRoute"),ElevatedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => RouterPageA()));},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
}
import 'package:flutter/material.dart';class RouterPageA extends StatelessWidget {const RouterPageA({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("RouterPageA"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("Test Navigator.pop"),ElevatedButton(onPressed: () {Navigator.pop(context);},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
}

Navigator.push有两个参数,一个是BuildContext,另一个是Route。代码中使用的是MaterialPageRoute,执行与对应平台风格一致的切换动画(android 与 ios平台不同)。如果使用 CupertinoPageRoute,页面切换效果是左右滑动。

PageRoute可以自定义,实现自定义页面切换的动画和行为。如果想自定义下过渡动画,使用 PageRouteBuilder 创建自定义路由,通过 pageBuilder 和 transitionsBuilder 属性来定义页面和过渡动画。

通过 pageBuilder 实现页面渐入动画

                Navigator.of(context).push(PageRouteBuilder(pageBuilder: (context, animation, secondaryAnimation) {return FadeTransition(opacity: animation, child: const RouterPageA());}));

pageBuilder + transitionsBuilder 实现过渡动画

Navigator.of(context).push(PageRouteBuilder(pageBuilder: (context, animation, secondaryAnimation) =>const RouterPageA(),transitionsBuilder:(context, animation, secondaryAnimation, child) {//动画的起始位置,轴y方向屏幕下侧偏移起点var start = const Offset(0, 1);//动画的结束位置,0表示没有偏移var end = Offset.zero;//动画曲线,easeInOut 表示开始慢,中间加速,结束慢var curve = Curves.easeInOut;// 创建一个从begin到end的补间动画,.chain 表示与曲线结合var tween = Tween(begin: start, end: end).chain(CurveTween(curve: curve));// SlideTransition 是一个动画Widgetreturn SlideTransition(position: animation.drive(tween), child: child);}));

 静态路由

静态路由需要提前注册,首先给每个路由定义一个名称,通过这个名称来导航到对应的路由。

在应用根级别 (MaterialApp 或者 CupertinoApp ) 中定义路由,使用routes参数将路由名称映射到对应的Widget。

不带参数与返回值案例

Navigator.of(context).pushNamed("/dart_test_router1");
import 'package:flutter/material.dart';import 'dart_test_router1.dart';class TestStaticRouterPage extends StatelessWidget {const TestStaticRouterPage({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: "Test Router Demo",theme: ThemeData(useMaterial3: false,primarySwatch: Colors.blue,textButtonTheme: const TextButtonThemeData(style: ButtonStyle(splashFactory: NoSplash.splashFactory),),),home: const RealTestStaticRouterPage(),routes: {//  "/": (context) => const RealTestStaticRouterPage(),"/dart_test_router1": (context) => const RouterPageA()},// initialRoute: "/",);}
}class RealTestStaticRouterPage extends StatelessWidget {const RealTestStaticRouterPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("TEST STATIC ROUTER PAGE"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("Test Static Router Page"),ElevatedButton(onPressed: () {Navigator.of(context).pushNamed("/dart_test_router1");},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}

带参数与返回值

import 'package:flutter/material.dart';import 'dart_test_router1.dart';
import 'dart_test_router3.dart';class TestStaticRouterPage extends StatelessWidget {const TestStaticRouterPage({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: "Test Router Demo",theme: ThemeData(useMaterial3: false,primarySwatch: Colors.blue,textButtonTheme: const TextButtonThemeData(// 鍘绘帀 TextButton 鐨勬按娉㈢汗鏁堟灉style: ButtonStyle(splashFactory: NoSplash.splashFactory),),),home: const RealTestStaticRouterPage(),routes: {//  "/": (context) => const RealTestStaticRouterPage(),"/dart_test_router1": (context) => const RouterPageA(),"/dart_test_router3": (context) => const RouterPage3()},// initialRoute: "/",);}
}class RealTestStaticRouterPage extends StatelessWidget {const RealTestStaticRouterPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("TEST STATIC ROUTER PAGE"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("Test Static Router Page"),ElevatedButton(onPressed: () async {var result = await Navigator.of(context).pushNamed("/dart_test_router3",arguments: {"title": "Hello"});print(result);},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
import 'package:flutter/material.dart';class RouterPage3 extends StatefulWidget {const RouterPage3({super.key});@overrideState<StatefulWidget> createState() {return _RouterPage3State();}
}class _RouterPage3State extends State<RouterPage3> {@overrideWidget build(BuildContext context) {var args =ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>?;final title = args?['title'] ?? "DEFAULT TITLE";return Scaffold(appBar: AppBar(title: Text("RouterPageA"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("GET TITLE===========銆?title"),ElevatedButton(onPressed: () {Navigator.pop(context, "I went from RouterPage3");},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
}

 

2024-09-12 10:01:46.569 25438-25629 flutter  I  I went from RouterPage3

路由操作

路由替换

像登录页跳首页的场景,我们希望页面跳转成功后,回到上上个页面。我们可以通过pushReplacement、pushReplacementNamed实现。

API一:动态路由替换

Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => RouterPageA()));

API二:静态路由替换

         var result = await Navigator.of(context).pushReplacementNamed("/dart_test_router3",arguments: {"title": "Hello"});

新路由入栈+移除之前的路由,直到条件满足

pushAndRemoveUntil 将给定路由推送给Navigator,删除先前的路由,直到该函数的参数predicate返回true为才停止。

import 'package:flutter/material.dart';import 'dart_test_router1.dart';
import 'dart_test_router3.dart';class TestRouterPage4 extends StatelessWidget {const TestRouterPage4({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: "Test pushAndRemoveUntil",theme: ThemeData(useMaterial3: false,primarySwatch: Colors.blue,textButtonTheme: const TextButtonThemeData(style: ButtonStyle(splashFactory: NoSplash.splashFactory),)),home: const RealTestRouterPage4(),);}
}class RealTestRouterPage4 extends StatelessWidget {const RealTestRouterPage4({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test pushAndRemoveUntil"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("test pushAndRemoveUntil"),ElevatedButton(onPressed: () {Navigator.pushAndRemoveUntil(context,MaterialPageRoute(builder: (context) => RouterPageA()),(Route<dynamic> route) => route.isFirst);},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)]),),);}
}

这个方式是跳转到某个页面,然后移除路由直到...为止

路由出栈,直到条件满足

在flutter 路由跳转中,我们想要回到特定的一个页面 比如:从 A -> B-> C ->D,我们向从 D页面 pop至 B 页面。我们可以使用 popUtil方法回到 B 页面。

popUntil 反复执行pop 直到该函数的参数predicate返回true为止。

import 'package:flutter/material.dart';import 'dart_test_router6.dart';class TestRouterPage5 extends StatelessWidget {const TestRouterPage5({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: "Test popUntil TestRouterPage5",theme: ThemeData(useMaterial3: false,primarySwatch: Colors.blue,textButtonTheme: const TextButtonThemeData(style: ButtonStyle(splashFactory: NoSplash.splashFactory),)),home: const RealTestRouterPage5(),);}
}class RealTestRouterPage5 extends StatelessWidget {const RealTestRouterPage5({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test popUntil TestRouterPage5"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("test popUntil TestRouterPage5"),ElevatedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => TestRouterPage6()));},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)]),),);}
}
import 'package:flutter/material.dart';import 'dart_test_router7.dart';class TestRouterPage6 extends StatelessWidget {const TestRouterPage6({super.key});@overrideWidget build(BuildContext context) {return RealTestRouterPage6();}
}class RealTestRouterPage6 extends StatelessWidget {const RealTestRouterPage6({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test popUntil TestRouterPage6"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("test popUntil TestRouterPage6"),ElevatedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => TestRouterPage7()));},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)]),),);}
}
import 'package:flutter/material.dart';class TestRouterPage7 extends StatelessWidget {const TestRouterPage7({super.key});@overrideWidget build(BuildContext context) {return RealTestRouterPage7();}
}class RealTestRouterPage7 extends StatelessWidget {const RealTestRouterPage7({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test popUntil TestRouterPage7"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("test popUntil TestRouterPage7"),ElevatedButton(onPressed: () {Navigator.of(context).popUntil((Route<dynamic> route) => route.isFirst);},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)]),),);}
}

上面的代码中调用Navigator.of(context)
                      .popUntil((Route<dynamic> route) => route.isFirst);直接回到了 TestRouterPage5。

 

删除指定路由

获得当前路由

ModalRoute.of(context);

 移除指定路由


if (route != null) {Navigator.of(context).removeRoute(route);
}

移除指定路由下方的单个路由

if (route != null) {Navigator.of(context).removeRouteBelow(route);
}

页面传参与数据回传

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:gsy_flutter_demo/widget/dart_test_router2.dart';import 'dart_test_router1.dart';class TestRouterPage extends StatelessWidget {const TestRouterPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("Test Navigator"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[const Text("Test MaterialPageRoute"),ElevatedButton(onPressed: () async {String backContent = await Navigator.of(context).push(MaterialPageRoute(builder: (context) => RouterPage2(title: "Custom Title")));print(backContent);},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
}
import 'package:flutter/material.dart';class RouterPage2 extends StatefulWidget {final String title;const RouterPage2({super.key, required this.title});@overrideState<StatefulWidget> createState() {return _RouterPage2State();}
}class _RouterPage2State extends State<RouterPage2> {@overrideWidget build(BuildContext context) {var widgitTitle = widget.title;return Scaffold(appBar: AppBar(title: Text("RouterPageA"),),body: Container(alignment: Alignment.center,margin: const EdgeInsets.all(10),child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("GET TITLE===========銆?widgitTitle"),ElevatedButton(onPressed: () {Navigator.pop(context, "I went from RouterPageA");},child: Text("Click ElevatedButton"),style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,foregroundColor: Colors.white,elevation: 10,minimumSize: Size(double.infinity, 50),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10))),)],),),);}
}

2024-09-11 14:51:16.211 24765-24840 flutter I  I went from RouterPageA


 

Navigator  的工作流程

Navigator  的核心是对路由栈的管理。当你调用 Navigator.push 时,一个新的路由被创建并推入栈顶;当你调用 Navigator.pop 时,栈顶的路由被移除。

  const Navigator({super.key,this.pages = const <Page<dynamic>>[],this.onPopPage,this.initialRoute,this.onGenerateInitialRoutes = Navigator.defaultGenerateInitialRoutes,this.onGenerateRoute,this.onUnknownRoute,this.transitionDelegate = const DefaultTransitionDelegate<dynamic>(),this.reportsRouteUpdateToEngine = false,this.clipBehavior = Clip.hardEdge,this.observers = const <NavigatorObserver>[],this.requestFocus = true,this.restorationScopeId,this.routeTraversalEdgeBehavior = kDefaultRouteTraversalEdgeBehavior,});

Navigator.push 

#Navigator.push

  @optionalTypeArgsstatic Future<T?> push<T extends Object?>(BuildContext context, Route<T> route) {return Navigator.of(context).push(route);}

Navigator.push 调用Navigator.of(context).push(route),内部 调用NavigatorState 的 push 方法:

  @optionalTypeArgsFuture<T?> push<T extends Object?>(Route<T> route) {_pushEntry(_RouteEntry(route, pageBased: false, initialState: _RouteLifecycle.push));return route.popped;}

 #NavigatorState

  void _pushEntry(_RouteEntry entry) {assert(!_debugLocked);assert(() {_debugLocked = true;return true;}());assert(entry.route._navigator == null);assert(entry.currentState == _RouteLifecycle.push);_history.add(entry);_flushHistoryUpdates();assert(() {_debugLocked = false;return true;}());_afterNavigation(entry.route);}

这里发生了一系列操作:

  • _history.add(route) : 将 新路由 添加到 路由栈 中。
  • route.install() : 安装路由,将页面挂载到 widget 树上。
  • route.didPush() : 通知 路由 已经被推入 栈顶 。
  • _cancelActivePointers() : 取消所有正在进行的触摸事件,防止发生意外事件。
  • route.didChange() : 通知 路由 状态发生变化。

push 方法返回一个 Future,该 Future 会在路由完成push操作时完成。

Navigator.pop

#Navigator.pop 

 Navigator.of(context).pop();
  @optionalTypeArgsvoid pop<T extends Object?>([ T? result ]) {assert(!_debugLocked);assert(() {_debugLocked = true;return true;}());final _RouteEntry entry = _history.lastWhere(_RouteEntry.isPresentPredicate);if (entry.pageBased) {if (widget.onPopPage!(entry.route, result) && entry.currentState == _RouteLifecycle.idle) {// The entry may have been disposed if the pop finishes synchronously.assert(entry.route._popCompleter.isCompleted);entry.currentState = _RouteLifecycle.pop;}entry.route.onPopInvoked(true);} else {entry.pop<T>(result);assert (entry.currentState == _RouteLifecycle.pop);}if (entry.currentState == _RouteLifecycle.pop) {_flushHistoryUpdates(rearrangeOverlay: false);}assert(entry.currentState == _RouteLifecycle.idle || entry.route._popCompleter.isCompleted);assert(() {_debugLocked = false;return true;}());_afterNavigation(entry.route);}
  • history.lastWhere:找到最后一个处于 “存在”状态 的路由条目。
  • entry.pageBased:路由是否是基于页面的。
  • widget.onPopPage:执行页面pop操作。
  • entry.route.onPopInvoked(true):通知路由pop操作被调用。
  • entry.pop<T>(result):直接调用pop。
  • _afterNavigation(entry.route):导航完成后回调。

相关文章:

Flutter路由

路由作为一种页面切换的能力&#xff0c;非常重要。Flutter 中路由管理有几个重要的点。 Navigator 1.0&#xff1a;Flutter 早期路由系统&#xff0c;侧重于移动端 &#xff0c;命令式编程风格&#xff0c;使用 Navigator.push() 和 Navigator.pop() 等方法来管理路由栈。 N…...

css预处理器less

CSS预处理器Less教程 CSS预处理器是一种扩展CSS功能的工具&#xff0c;它允许开发者使用变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等高级特性&#xff0c;使CSS代码更加灵活、易于维护和扩展。Less是其中一种流行的CSS预处理器&#xff0c;它使用JavaScript编…...

WEB服务器——Tomcat

服务器是可以使用java完成编写&#xff0c;是可以接受页面发送的请求和响应数据给前端浏览器的&#xff0c;而在开发中真正用到的Web服务器&#xff0c;我们不会自己写的&#xff0c;都是使用目前比较流行的web服务器。 如&#xff1a;Tomcat 1. 简介 Tomcat 是一个开源的轻量…...

C++ STL(3)list

文章目录 一、list 详解1、内存管理2、常用操作3、迭代器erase()删除list中的元素 前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;中的 list 容器是一种双向链表数据结构&#xff0c;它允许在常数时间内进行插入和删除操作&#xff0c;而无需重新分配整个容器或移动…...

Ubuntu下安装Zookeeper集群

Zookeeper集群是一个开源的分布式协调服务系统&#xff0c;它由Apache软件基金会维护&#xff0c;旨在为分布式应用提供一致性和可靠性的服务。 在Zookeeper集群中&#xff0c;服务器可以扮演三种角色——领导者&#xff08;Leader&#xff09;、跟随者&#xff08;Follower&a…...

模版and初识vector

一、引言 在C语言中&#xff0c;不论是数组&#xff0c;还是结构体定义的数组&#xff0c;功能都比较欠缺&#xff0c;不是单纯的添加几个变量就能够解决的。缺少增删查改的功能&#xff0c;为了解决这个问题&#xff0c;C决定填上C语言这个坑&#xff0c;但是填过坑的人都知道…...

网站开发基础:HTML、CSS

前端开发主要使用的技术如 HTML、CSS 和 JavaScript 等。 简单制作一个网页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>柒毓同学网站的首页</title><style>.c1{border: solid 1px g…...

IP协议讲解

IP协议 IP协议的本质&#xff1a;提供一种能力&#xff0c;将数据跨网络从A主机传输到B主机 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大 的数字是15, 因…...

SpringMVC4-SpringMVC获取请求参数

目录 通过ServletAPI获取&#xff08;不常用&#xff09; 通过控制器方法的形参获取请求参数 RequestParam RequestHeader CookieValue 通过POJO获取请求参数 解决获取请求参数的乱码问题 test_param.html&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

【C++】C++基础

目录 一. C关键字(C98) 二、C的第一个程序 三、命名空间 3.1.namespace的价值 3.2.namespace的定义 3.2.命名空间使用 总结&#xff1a;在项目当中第一、第二种方法搭配使用&#xff0c;第三种冲突风险非常大&#xff0c;仅适合练习使用。 四、C输入&输出 五、缺省…...

自动化运维工具 Ansible

Ansible 基础 Ansible 介绍 Ansible 是一个自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、 func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible 的…...

深度学习:GAN图像生成

GAN的诞生背景 诞生&#xff1a; 2014年由Ian Goodfellow提出 创新性&#xff1a; 无监督学习&#xff1a;GAN 提供了一种新的方法来进行无监督学习&#xff0c;即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练&#xff1a;通过引入对抗机制&#xff0c;G…...

django基于python的房价分析可视化系统的设计与开发 h1y0i

目录 项目介绍技术栈具体实现截图Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取 项目介绍 大数据分析是现下比较热门的词汇&#xff0c;通过分析之后可以得到更多深入且有价值的信息。现实的科…...

Labview helper

IMAQ Advanced Setup Learn Geometric Pattern 2 VI 参数说明Curve Extraction Mode (0)指定VI如何识别图像中的曲线。如果您希望VI不对图像中对象的均匀性或图像背景做出任何假设&#xff0c;请将此选项设置为正常。如果您希望VI假定图像中的对象或图像背景由均匀的像素值组成…...

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…...

如何用JavaScript编写一个简单的计数器

在网页开发中&#xff0c;计数器是一种常见的功能&#xff0c;它可以帮助我们记录点击次数、显示时间等。下面我将介绍如何在HTML页面中使用JavaScript实现一个基本的计数器。如图&#xff1a; 1、 创建HTML结构 首先&#xff0c;我们需要创建一个基础的HTML结构来容纳我们的计…...

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景

前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数&#xff0c;展示用户评分的效果&#xff0c;用户可以通过点击星星或滑动星星的方式进行评分。同时&#xff0c;uni-rate组件也支持自定义星星图标、星星…...

算法笔记(三)——前缀和算法

算法笔记&#xff08;三&#xff09;——前缀和算法 文章目录 算法笔记&#xff08;三&#xff09;——前缀和算法一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和算法是一种用空间换时间的算法&am…...

Nginx技术深度解析与实战应用

Nginx技术深度解析与实战应用 Nginx是一款轻量级、高性能的Web服务器、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;由俄罗斯的程序设计师Igor Sysoev开发。Nginx以其内存占用少、启动迅速、高并发能力强等特性&#xff0c;在互联网项目…...

Maven Surefire Plugin

Maven Surefire Plugin 最新版本新特性详解 Maven Surefire Plugin 是用于运行单元测试和集成测试的重要工具&#xff0c;支持 JUnit、TestNG 等测试框架。插件的新版本引入了许多新特性和配置选项&#xff0c;这些功能提升了测试执行的性能、灵活性和并发能力。在本节中&…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...