商务网站设计服务外包公司是干什么的

pingmian/2026/1/21 13:28:47/文章来源:
商务网站设计,服务外包公司是干什么的,服务平台网站设计,不收费推广网站有哪些#x1f4da; 目录 介绍布局原理和约束盒模型布局 约束容器ConstrainedBox非约束容器UnconstrainedBox 线性布局 行row列column 弹性布局流式布局 WrapFlow 层叠布局对齐和相对定位布局构建回调 LayoutBuilder布局过程中AfterLayout布局完成后执行 本文学习和引用自《Flutte… 目录 介绍布局原理和约束盒模型布局 约束容器ConstrainedBox非约束容器UnconstrainedBox 线性布局 行row列column 弹性布局流式布局 WrapFlow 层叠布局对齐和相对定位布局构建回调 LayoutBuilder布局过程中AfterLayout布局完成后执行 本文学习和引用自《Flutter实战·第二版》作者杜文 1. 介绍 布局类组件都会包含一个或多个子组件不同的布局类组件对子组件排列layout方式不同。如下 属性说明用途LeafRenderObjectWidget非容器类组件基类Widget树的叶子节点用于没有子节点的widget通常基础组件都属于这一类比如ImageSingleChildRenderObjectWidget单子组件基类包含一个子Widget如ConstrainedBox、DecoratedBox等MultiChildRenderObjectWidget多子组件基类包含多个子Widget一般都有一个children参数接受一个Widget数组。如Row、Column、Stack等 2. 布局原理和约束 Flutter 中有两种布局模型分别是基于 RenderBox 的盒模型布局、基于 Sliver ( RenderSliver ) 按需加载列表布局。布局流程如下 上层组件向下层组件传递约束constraints条件。下层组件确定自己的大小然后告诉上层组件。注意下层组件的大小必须符合父组件的约束。上层组件确定下层组件相对于自身的偏移和确定自身的大小大多数情况下会根据子组件的大小来确定自身的大小。 3. 盒模型布局 盒模型布局是 Flutter 中最常用的布局方式它基于 RenderBox 类所有的布局组件都继承自该类。在布局过程中父级传递给子级的约束信息由 BoxConstraints 描述包含最大宽高信息子组件大小需要在约束的范围内。 3-1. 约束容器ConstrainedBox 如下例子。虽然将Container的高度设置为5像素但是最终却是50像素这正是ConstrainedBox的最小高度限制生效了 ConstrainedBox(constraints: BoxConstraints(// 宽度尽可能大minWidth: double.infinity,// 最小高度为50像素minHeight: 50.0),child: Container(height: 5.0, child: DecoratedBox(decoration: BoxDecoration(color: Colors.red),),), )当存在有多重限制时取父子中相应数值较大的。实际上只有这样才能保证父限制与子限制不冲突。 3-2. 非约束容器UnconstrainedBox 有时候想要去掉约束则可以使用UnconstrainedBox只不过UnconstrainedBox对父组件限制的“去除”并非是真正的去除UnconstrainedBox其本身还是会收到约束只是UnconstrainedBox它内部的元素不会被约束了。因为任何时候子组件都必须遵守其父组件的约束 ConstrainedBox(// 父constraints: BoxConstraints(minWidth: 60.0, minHeight: 100.0),// 去除父级限制child: UnconstrainedBox(child: ConstrainedBox(// 子constraints: BoxConstraints(minWidth: 90.0, minHeight: 20.0),child: redBox,),) )4. 线性布局 所谓线性布局即指沿水平或垂直方向排列子组件。Flutter 中通过Row和Column来实现线性布局类似于Android 中的LinearLayout控件。Row和Column都继承自Flex。 4-1. 行Row Row可以沿水平方向排列其子widget也就是横向排列Row的高度等于子组件中最高的子元素高度。 属性说明默认值textDirection水平方向子组件的布局顺序是从左往右还是从右往左系统当前Locale环境的文本方向mainAxisSizeRow在主轴(水平)方向占用的空间MainAxisSize.max 尽可能多的占用水平方向的空间verticalDirectionRow纵轴垂直的对齐方向VerticalDirection.down 从上到下mainAxisAlignment子组件在Row所占用的空间内水平对齐方式-crossAxisAlignment子组件在Row所占用空间内垂直方向的对齐方式-children子组件数组- 例子 override Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),),body: Row(// 水平方向居中对齐mainAxisAlignment: MainAxisAlignment.center,// 垂直方向居中对齐crossAxisAlignment: CrossAxisAlignment.center,children: [const Text(111),const Text(222),const Text(333)],),); }4-2. 列Column Column可以在垂直方向排列其子组件也就是竖向排列。 属性说明默认值textDirection水平方向子组件的布局顺序是从左往右还是从右往左系统当前Locale环境的文本方向mainAxisSizeColumn在主轴(水平)方向占用的空间MainAxisSize.max 尽可能多的占用水平方向的空间verticalDirectionColumn纵轴垂直的对齐方向VerticalDirection.down 从上到下mainAxisAlignment子组件在Column所占用的空间内水平对齐方式-crossAxisAlignment子组件在Column所占用空间内垂直方向的对齐方式-children子组件数组- 例子 override Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),),body: Column(// 水平方向居中对齐mainAxisAlignment: MainAxisAlignment.center,// 垂直方向居中对齐crossAxisAlignment: CrossAxisAlignment.center,children: [const Text(111),const Text(222),const Text(333)],),); }5. 弹性布局 弹性布局允许子组件按照一定比例来分配父容器空间。Flutter 中的弹性布局主要通过Flex和Expanded来配合实现。Flex组件可以沿着水平或垂直方向排列子组件如果你知道主轴方向使用Row或Column会方便一些因为Row和Column都继承自Flex属性基本相同。而Expanded 只能作为 Flex 的子组件。因为 Row和Column 都继承自 Flex所以 Expanded 也可以作为它们的子组件 如下代码最终效果是一个左右各占一半的双色长方形 import package:flutter/material.dart;class AboutPage extends StatefulWidget {final String userName;const AboutPage({super.key, required this.userName});overrideStateAboutPage createState() AboutPageState(); }class AboutPageState extends StateAboutPage {final title About Page;var count 0;void handleAdd() {count;debugPrint(Count$count);}overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: ConstrainedBox(constraints: const BoxConstraints(minWidth: double.infinity),child: Column(children: [Flex(direction: Axis.horizontal,children: [Expanded(flex: 2,child: Container(height: 30.0,color: Colors.blue,child: const Text(A),),),Expanded(flex: 2,child: Container(height: 30.0,color: Colors.yellow,child: const Text(B),),),],)],),),);} }6. 流式布局 Row中如果子 widget 超出屏幕范围则会报溢出错误这是因为Row默认只有一行如果超出屏幕不会折行。我们把超出屏幕显示范围会自动折行的布局称为流式布局Flutter中通过Wrap和Flow来支持流式布局。 6-1. Wrap Wrap 是一个流式布局的容器它能够根据子组件的大小自动换行。 属性说明默认值textDirection水平方向子组件的布局顺序是从左往右还是从右往左系统当前Locale环境的文本方向mainAxisSizeColumn在主轴(水平)方向占用的空间MainAxisSize.max 尽可能多的占用水平方向的空间verticalDirectionColumn纵轴垂直的对齐方向VerticalDirection.down 从上到下mainAxisAlignment子组件在Column所占用的空间内水平对齐方式-crossAxisAlignment子组件在Column所占用空间内垂直方向的对齐方式-children主轴方向子widget的间距-spacing子组件数组-runSpacing纵轴方向的间距-runAlignment纵轴方向的对齐方式- Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: ConstrainedBox(constraints: const BoxConstraints(minWidth: double.infinity),child: const Wrap(spacing: 8.0, // 主轴(水平)方向间距runSpacing: 4.0, // 纵轴垂直方向间距alignment: WrapAlignment.center, //沿主轴方向居中children: Widget[Chip(avatar:CircleAvatar(backgroundColor: Colors.blue, child: Text(A)),label: Text(Hamilton),),Chip(avatar:CircleAvatar(backgroundColor: Colors.blue, child: Text(M)),label: Text(Lafayette),),Chip(avatar:CircleAvatar(backgroundColor: Colors.blue, child: Text(H)),label: Text(Mulligan),),Chip(avatar:CircleAvatar(backgroundColor: Colors.blue, child: Text(J)),label: Text(Laurens),),],),),); }6-2. Flow 一般很少会使用Flow因为其过于复杂需要自己实现子 widget 的位置转换在很多场景下首先要考虑的是Wrap是否满足需求。Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景。 Flow的优点 灵活由于我们需要自己实现FlowDelegate的paintChildren()方法所以我们需要自己计算每一个组件的位置因此可以自定义布局策略。性能好Flow是一个对子组件尺寸以及位置调整非常高效的控件在对子组件进行位置调整的时候进行了优化。Flow用转换矩阵在对子组件进行位置调整的时候进行了优化在Flow定位过后如果子组件的尺寸或者位置发生了变化在FlowDelegate中的paintChildren()方法中调用context.paintChild 进行重绘而context.paintChild在重绘时使用了转换矩阵并没有实际调整组件位置。 Flow的缺点 复杂需要自己实现子 widget 的位置转换。大小固定不能自适应子组件大小必须通过指定父容器大小或自己实现TestFlowDelegate的getSize返回固定大小。 import package:flutter/material.dart;class AboutPage extends StatefulWidget {final String userName;const AboutPage({super.key, required this.userName});overrideStateAboutPage createState() AboutPageState(); }class TestFlowDelegate extends FlowDelegate {EdgeInsets margin;TestFlowDelegate({this.margin EdgeInsets.zero});double width 0;double height 0;overridevoid paintChildren(FlowPaintingContext context) {var x margin.left;var y margin.top;//计算每一个子widget的位置for (int i 0; i context.childCount; i) {var w context.getChildSize(i)!.width x margin.right;if (w context.size.width) {context.paintChild(i, transform: Matrix4.translationValues(x, y, 0.0));x w margin.left;} else {x margin.left;y context.getChildSize(i)!.height margin.top margin.bottom;//绘制子widget(有优化)context.paintChild(i, transform: Matrix4.translationValues(x, y, 0.0));x context.getChildSize(i)!.width margin.left margin.right;}}}overrideSize getSize(BoxConstraints constraints) {// 指定Flow的大小简单起见我们让宽度尽可能大但高度指定为200// 实际开发中我们需要根据子元素所占用的具体宽高来设置Flow大小return const Size(double.infinity, 200.0);}overridebool shouldRepaint(FlowDelegate oldDelegate) {return oldDelegate ! this;} }class AboutPageState extends StateAboutPage {final title About Page;overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: Flow(delegate: TestFlowDelegate(margin: const EdgeInsets.all(10.0)),children: Widget[Container(width: 80.0, height:80.0, color: Colors.red,),Container(width: 80.0, height:80.0, color: Colors.green,),Container(width: 80.0, height:80.0, color: Colors.blue,),Container(width: 80.0, height:80.0, color: Colors.yellow,),Container(width: 80.0, height:80.0, color: Colors.brown,),Container(width: 80.0, height:80.0, color: Colors.purple,),],),);} }7. 层叠布局 层叠布局和Web中的绝对定位是相似的子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照代码中声明的顺序堆叠起来。Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠而Positioned用于根据Stack的四个角来确定子组件的位置。 Stack 属性描述alignment决定如何去对齐没有定位没有使用Positioned或部分定位的子组件textDirection确定alignment对齐的参考系fit用于确定没有定位的子组件如何去适应Stack的大小clipBehavior决定对超出Stack显示空间的部分如何剪裁 Positioned 属性描述top离Stack上边的距离left离Stack左边的距离right离Stack右边的距离bottom离Stack下边的距离width宽度height高度 例子 Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: ConstrainedBox(constraints: const BoxConstraints.expand(),child: Stack(fit: StackFit.expand,alignment: Alignment.center,children: [Container(color: Colors.blue,child: const Text(111),),const Positioned(left: 18.0,child: Text(222),),const Positioned(top: 18.0,child: Text(333),)],),),); }8. 对齐和相对定位 如果我们只想简单的调整一个子元素在父元素中的位置的话使用Align组件会比Stack和Positioned更简单一些。Align只能有一个子元素不存在堆叠。 Align 属性描述alignment一个AlignmentGeometry类型的值表示子组件在父组件中的起始位置widthFactor是个缩放因子会乘以子元素的宽最终的结果就是Align 组件的宽heightFactor是个缩放因子会乘以子元素的高最终的结果就是Align 组件的高 Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: Container(width: double.infinity,height: 120.0,color: Colors.blue,child: const Align(// 右上角对齐alignment: Alignment.topRight,// 如果不指定宽高 则这个就生效// widthFactor: 2,// heightFactor: 2,child: FlutterLogo(size: 60,),),),); }Center Center继承自Align它比Align只少了一个alignment 参数因为Center默认是居中对齐的。 Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: Container(color: Colors.blue,child: const Center(widthFactor: 2,heightFactor: 2,child: FlutterLogo(size: 60,),),),); }9. 布局构建回调 在Flutter中我们可以使用LayoutBuilder和AfterLayout来处理布局构建后的回调。 9-1. LayoutBuilder布局过程中 通过 LayoutBuilder我们可以在布局过程中拿到父组件传递的约束信息然后我们可以根据约束信息动态的构建不同的布局。 import package:flutter/material.dart; import package:flutter/rendering.dart;class AboutPage extends StatefulWidget {final String userName;const AboutPage({super.key, required this.userName});overrideStateAboutPage createState() AboutPageState(); } // 处理排列函数 class ResponsiveColumn extends StatelessWidget {const ResponsiveColumn({Key? key, required this.children}) : super(key: key);final ListWidget children;overrideWidget build(BuildContext context) {// 通过 LayoutBuilder 拿到父组件传递的约束然后判断 maxWidth 是否小于200return LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {if (constraints.maxWidth 200) {// 最大宽度小于200显示单列return Column(mainAxisSize: MainAxisSize.min,children: children,);} else {// 大于200显示双列var myChildren Widget[];for (var i 0; i children.length; i 2) {if (i 1 children.length) {myChildren.add(Row(mainAxisSize: MainAxisSize.min,children: [children[i], children[i 1]],));} else {myChildren.add(children[i]);}}return Column(mainAxisSize: MainAxisSize.min,children: myChildren,);}},);} }// 打印布局时的约束信息 class LayoutLogPrintT extends StatelessWidget {const LayoutLogPrint({Key? key,this.tag,required this.child,}) : super(key: key);final Widget child;final T? tag; //指定日志tagoverrideWidget build(BuildContext context) {return LayoutBuilder(builder: (_, constraints) {// assert在编译release版本时会被去除assert(() {debugPrint(${tag ?? key ?? child}: $constraints);return true;}());return child;});} }// 布局 class AboutPageState extends StateAboutPage {final title About Page;var count 0;void handleAdd() {count;debugPrint(Count$count);}overrideWidget build(BuildContext context) {var myChildren List.filled(6, const Text(正));return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: Column(children: [SizedBox(width: 240,child: ResponsiveColumn(children: myChildren,),),ResponsiveColumn(children: myChildren),// 打印布局时的约束信息 宽高const LayoutLogPrint(child:Text(xxx))],),);} }9-2. AfterLayout布局完成后执行 AfterLayout不是一个widget而是一个Mixin可以用于在widget布局完成后执行代码。这对于在布局构建完成后需要进行一些计算或调整的场景非常有用。在项目中可以使用开源插件传送门 先安装包 flutter pub add after_layout示例 import package:flutter/material.dart; import package:after_layout/after_layout.dart;class AboutPage extends StatefulWidget {final String userName;const AboutPage({super.key, required this.userName});overrideStateAboutPage createState() AboutPageState(); }class AboutPageState extends StateAboutPage with AfterLayoutMixinAboutPage {final title About Page;overridevoid afterFirstLayout(BuildContext context) {// 获取渲染的组件final RenderBox renderBox context.findRenderObject() as RenderBox;// 获取组件大小final size renderBox.size;// 获取组件偏移量final offset renderBox.localToGlobal(Offset.zero);debugPrint(size.toString());debugPrint(offset.toString());}overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(title),backgroundColor: Theme.of(context).colorScheme.inversePrimary,),body: Container(color: Colors.blue,child: const Center(widthFactor: 2,heightFactor: 2,child: FlutterLogo(size: 60,),),),);} }本次分享就到这儿啦我是鹏多多如果您看了觉得有帮助欢迎评论关注点赞转发我们下次见~ 往期文章 手把手教你搭建规范的团队vue项目包含commitlinteslintprettierhuskycommitizen等等Web Woeker和Shared Worker的使用以及案例Vue2全家桶Element搭建的PC端在线音乐网站vue3element-plus配置cdn助你上手Vue3全家桶之Vue3教程助你上手Vue3全家桶之VueX4教程助你上手Vue3全家桶之Vue-Router4教程超详细Vue的九种通信方式超详细Vuex手把手教程使用nvm管理node.js版本以及更换npm淘宝镜像源vue中利用.env文件存储全局环境变量以及配置vue启动和打包命令超详细Vue-Router手把手教程 个人主页 CSDNGitHub简书博客园掘金

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

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

相关文章

天津专业做网站网站内页制作

背景 > 经过检测,我们识别到您的应用,目前未适配安卓11(API30),请您关注适配截止时间,尽快开展适配工作,避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

千万pv网站开发成本网上做网站怎么赚钱

部署网站 说好不哭 在接触serverless架构之前,我们如果想实现上线一个Web网站,就要在开发前期经过操作很多冗杂但又必须的步骤,不少小白可谓是快速的从入门到退坑。 编写代码,部署应用,部署数据库,申请域…

国外主流网站开发技术丽江建设信息网站

容器化是最近几年 DevOps 界流行的趋势,通过业务的容器化我们将创建一个完全打包、自包含的计算环境,让软件开发人员能够更加快速地创建和部署自己的应用程序。然而长期以来,由于镜像格式的限制,容器启动镜像的加载是很慢的&#…

如何制作网页跳转链接关键词seo排名公司

今日内容 1. Junit单元测试 2. 反射 3. 注解Junit单元测试: * 测试分类:1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。2. 白盒测试:需要写代码的。关注程序具体的执行流程。* Junit使…

衡水移动网站建设价格中国最好的猎头公司

随着加密数字货币的交易方式逐渐完善,杠杆交易也逐渐成为交易者获利的重要手段之一。杠杆交易可以通过借贷放大投资收益,但是也同时放大风险。 实际使用过程中有很多小白会有不少疑问:比如杠杆交易和合约交易都是放大风险,那这两…

旅游网站的建设依据和背景哪个旅游网站可以做私人定制

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

百度做网站联系电话怎么做一个好的wordpress

一、同源策略 同源策略(Same Origin Policy): 同源是指域名,协议,端口完成一致,那么这两个url就是同源。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,也是浏览器故意设置的一个功能限制。如果缺少了同源策…

商城网站建设都有哪些类型阀门行业网站怎么做

1.集合 在内存层面需要针对于多个数据进行存储。此时可以考虑的容器有:数组、集合类。 数组存储多个数据方面的特点: 数组一旦初始化,其长度就是确定的。数组中的多个元素是依次紧密排列的,有序的,可重复的。数组一…

15年做那些网站能致富免费的高清视频素材网站

迅雷已经用了 10 年,一直把它看作是速度最快也最方便的下载工具。迅雷会员也是我必续的服务。但,迅雷堕落了。thunder: 迅雷专属链接越来越少,基本都是磁力、BT 的天下迅雷会员加速不再给力,大量资源速度为 0。会员虽然还有一年多…

目前网站建设用哪种语言公司注销后 网站备案吗

register方法正如前面所提到的,在register方法中只绑定事物到服务容器,而不要做其他事情,否则,一不小心就能用到一个尚未被加载的服务提供者提供的服务。现在让我们来看看一个基本的服务提供者长什么样:namespace AppP…

烟台北京网站建设公司哪家好wordpress博客背景

1. 问题描述 问题描述,现A表(用户查看实验的次数)有user_id和exp_id两个字段,其中user_id加exp_id不唯一。B表有user_id,exp_id以及exp_num三个字段,其中user_id加exp_id唯一(表中未建唯一索引)。 现需要将A表的数据同步到B表,单机模式通过定时任务同步。A表的数据有…

教育门户网站模板外贸小网站建设

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …

软件介绍下载网站建设门户网站建设公司价位

目录 一、环境 1、映射、域名、三墙 2、Erlang和socat安装(三台服务器都实行) 二、部署三台rabbitmq-3.8.15实例 1、rabbitmq官网下载地址 : 2、解压rabbitmq 3、添加系统变量 4、启动web插件、启动rabbitmq 5、在rabbitmq1上添加用…

天津医疗行业网站建设仿业务网站源码

**向前插入迭代器,是架构在具有push_front向前插入函数的序列容器(比如deque list)上的输出迭代器,可以利用*改迭代器提供的“”,“*”,“”以“*fii9;”的类似的形式完成容器元素的赋值。**其中“*”和&qu…

深圳建设局网站注册结构师培训附件网页制作工具的选择

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现&#xff0c…

瑞安网站建设步骤网站开发微盘

题意: 给你两个数字n和m;代表会有n个苹果掉落,m次可以移动的机会;有两棵树,开始你站在树1下面,一分钟只能移动一次,下面的数值代表在哪一颗树下会掉落苹果;问你在可移动的范围内&am…

免费动漫网站成都网站设计开发做得好

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: [1,3,5,6], 5 输出: 2 代码 class Solution {public int sear…

网站下载文件怎么做关键词优化举例

单例模式示例: public sealed class WindowService {//定义一个私有的静态全局变量来保存该类的唯一实例private static WindowService Service;//定义一个只读静态对象//且这个对象是在程序运行时创建的private static readonly object syncObject new object();…

网站空间多大合适wordpress+仿简书模板

文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path…

电子商务网站建设 名词解释创建网站大约多少钱

一. 简介 JSDoc 3 是一个用于 JavaScript 的API文档生成器,类似于 Javadoc 或 phpDocumentor。可以将文档注释直接添加到源代码中。JSDoc 工具将扫描您的源代码并为您生成一个 HTML 文档网站。 JSDoc 是一种用于 JavaScript 代码文档注释的标记语言和工具。它不仅…