Nacos
用于替代已经停止维护的 Eureka 。
服务端
在AlibabaNacos的里程碑中选择版本进行下载。
下载解压后,在 bin 目录下打开终端,输入指令启动。Windows 运行cmd文件,Linux运行sh文件
1./startup.cmd -m standalone
默认服务端口为8848,可在 conf 目录下配置文件 application.properties 中更改。
客户端
在父工程的pom文件中添加依赖管理。
12345678910111213141516171819202122 <properties> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId& ...
问题发生场景
以下场景都建立在 maven 打 jar 包的基础上。
昨日我如往常一样,在springboot项目中新建 webapp 文件夹,然后在里面放俩空文件夹,作为项目里文件上传中转的地方。然后发现打包后程序运行时并不能找到webapp文件夹中的静态资源。查看编译后产生的 target 目录发现,webapp并没有被编译。如下图所示。
而平时开发,直接通过 idea 运行的时候,却会编译 webapp 下的资源文件到 classes 目录下。如下图所示。
解决方案
如果跟我一样不愿意放弃 webapp 的使用,那么想要解决这个问题,就需要手动指定项目构建时的资源路径。
在 pom.xml 文件的 build 标签中,添加以下代码,手动指定资源路径。
123456789<resources> <resource> <directory>src/main/webapp</directory> <targetPath>META-INF/resources</targetPat ...
Eureka
微服务的注册中心。
服务端
1.添加依赖
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
2.应用启动入口标注@EnableEurekaServer
123456789@EnableEurekaServer@SpringBootApplicationpublic class EurekaServerDemoApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerDemoApplication.class, args); }}
3.在 application.yml 中 ...
TextFormField
decoration:使用 InputDecoration 来创建文本框
controller:指定 TextEditingController 对象,可以通过这个对象来获取文本框的值
InputDecoration
focusedBorder:文本框聚焦的时候的边框样式
disabledBorder:禁止输入时
enabledBorder:允许选中时
contentPadding:文本区实际上是由 InputDecoration 创建的,而此处的 padding 就是设置的这个文本区的 padding
border:设置为 Border.none 可以不渲染边框。但是常常会造成文本框内容不能居中。
hintText:输入框的提示字段,类似于 html 中的 placeholder
ps:想要输入框的内容正常的垂直居中,就需要边框,不想要样式的话,可以设置边框为透明色,宽度为0。除此之外,还需要设置 contentPadding 为0才能保证绝对垂直居中。
代码区
12345678910111213TextFormField( decorati ...
在学习 Provider 的时候,我在 flutter 的官方小教程中,看到了一个 demo,有关购买商品,加入购物车的。刚学习 Provider 的时候,很多地方不明白,所以那个案例也没有能够理解。
今天的我已经能使用 Navigator 和 Provider 的知识了。利用我已有的知识,可以大概模仿出官方 demo 的样子了。
路由分析
这个 demo 涉及到三个页面,第一个是登录界面,第二个是商品界面,第三个是购物车界面。
分别命名为:Login, Catalog, Cart
123456789import 'package:dayly/Login.dart';import 'package:dayly/Catalog.dart';import 'package:dayly/Cart.dart';var routes={ 'login':(context) => const Login(), "catalog":(context) => const Ca ...
ottomNavigatorBar 是 Scaffold 组件中的,底部的导航栏。
BottomNavigatorBar
items:BottomNavigatorBarItem()
label:标签名称
icon:图标
backgroundColor:背景颜色,在 BottomNavigatorBar 的type设置为BottomNavigationBarType.shifting时生效
currentIndex:当前选项卡的索引,当前选项卡会高亮
backgroundColor:导航栏背景图片
elevation:阴影
fixedColor:选中的 item 字体颜色和图标颜色
onTap:点击选项时触发的函数,需要传入 index (点击选项的索引),(index){xxx},用于更新当前索引
Navigator用于管理路由。
三种路由(省略动态路由)
匿名路由
Navigator.push(context, MaterialPageRoute(build:(context)=>diyWidget()))
<!--code0-->
name 指创建的路由表中的 key,如下所示
var routes={
'home':(context)=> const IndexPage(),
'OfficialDemo':(context)=>const OfficialDemo(),
'Container':(context)=>const ContainerDemo(),
'ColumnRow':(context)=>const ColumnAndRow(),
'Flex':(context)=>const FlexPage(),
'Wrap':(context) ...
InheritedWidget
flutter中用于数据共享的组件。
创建自定义类,继承 InheritedWidget ,用这个自定义类的组件实例包裹子组件,使得子组件及其后代都可以访问自定义类实例中的共享数据。
自定义类
使用 inh 简写快速生成自定义类并继承数据共享组件。
12345678910111213141516171819class WaitingData extends InheritedWidget { final String name; //自定义共享数据,需要final前缀 const WaitingData({ Key? key, required Widget child, required this.name }) : super(key: key, child: child); static WaitingData of(BuildContext context) {//静态方法,简化了获取共享数据的方式。不用这种就用下面这行复杂方式 final WaitingData? ...
Provider是第三方状态管理的库。就我目前的水平来看,它貌似能代替 StatefulWidget 和 InheritedWidget 。
安装(带^表示可以自动更新)
12dependencies: provider: ^6.0.3
使用
创建数据模型(自定义类),继承 ChangeNotifier ,暴露想要共享的数据, 以及创建可选的修改数据的方法。
创建观察者,或者说数据模型的提供者——Provider。
通过Provider()提供的数据通常是不可变的。
通过ChangeNotifierProvider()提供的数据可以改变,并可以通过调用notifyListeners()来更新使用到共享数据的组件。
和 InheritedWidget 类似,包裹需要使用共享数据的子孙组件。包裹一次,子孙组件都可以作为监听者(listener)使用数据。
为 create 属性提供构造器,需要传入上下文context
child 子组件,也就是包裹的子孙组件
作为 Listener 使用共享数据。因为时常需要响应数据的变化,所以叫监听者。
context.w ...
DataTable
sortColumnIndex:排序的列号
sortAscending:排序方式,true为升序,false为降序,决定了排序箭头的上下,也决定了排序事件的传入值
columns:表格头部们
rows:各行数据,通常是动态生成的
详情用法见代码部分,我相信未来的我看到代码一定能秒懂。
代码区
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273class Student{ String name; int age; String school; bool selected; //学生类和它的构造函数 Student(this.name,this.age,this.school,{this.selected=false});}class MyPage extends StatefulWidg ...