创建一个时钟组件

指针绘制 给定时,分,秒,绘制出指针在表盘上的位置 时针 给定 时,分 class HourHand extends CustomPainter { int hours; int minutes; final Paint painter; // 1 HourHand({ required this.hours, required this.minutes }): painter = Paint() ..color = Colors.black ..strokeWidth = 20 ..style = PaintingStyle.stroke; @override void paint(Canvas canvas, Size size) { final radius = size.width / 2; // 2 canvas.save(); // 3 canvas.translate(radius, radius); // 4 canvas.rotate(hours >= 12 ? 2 * pi * ((hours - 12) / 12 + minutes / 720) : 2 * pi * (hours / 12 + minutes / 720)); // 5 Path path = Path(); path.

[Note] Spring Data JPA 笔记

引入依赖 简单查询 预生成方法 自定义简单查询 属性查询 组合查询 自定义SQL查询 HQL SQL 修改和删除 @Modifying @Transactional CANCEL 已命名查询 定义命名查询 调用命名查询 运行验证 复杂查询 分页查询 pageable 排序和限制 动态条件查询 @Test fun testSpecification() { userRepository.deleteAll() val users = listOf<User>( User(null, "hello", 1), User(null, "world", 2), User(null, "holy", 3), User(null, "shit", 4) ) userRepository.saveAll(users) val matchUsers = userRepository.findAll { root, query, criteriaBuilder -> val p1 = criteriaBuilder.like(root.get("name"), "w%") val p2 = criteriaBuilder.greaterThan(root.get("age"), 0) criteriaBuilder.and(p1, p2) } matchUsers.forEach { println(it.

Flutter 局部更新

Flutter 局部更新 StatefulBuilder Widget build(BuildContext context) { return Column( children: [ buildCheapUpdateWidget(context), buildExpensiveUpdateWidget(context) ] ) } 在上述代码中,如果调用了 setState 更新状态,整个组件会重新 build 一遍,届时 buildExpensiveUpdateWidget 会 重新调用一遍,这是我们引入局部更新组建 StatefulBuilder( builder: (context, setState) => Widget ) 更新时用 builder 中的 setState 即可 正是有了局部更新,我们可以解决在 Dialog 中 setState 不起作用的问题,详情看 这篇文章 Selector Selector 是另一种状态管理方式 Provider 的局部更新方法 在使用 Consumer 的时候,如果 ChangeNotifier 调用了 notifyListeners ,所有监听的 Consumer 都会更新, 但是没那个必要,所以我们引入局部更新来避免不必要的更新 Selector<State, T>( selector: (context, state) => state.value, builder: (context, value, child) => Widget ) 注意 目前的理解,需要搭配 context.

SprintBoot with Redis 简单使用

SprintBoot with Redis 简单使用 定义 redisTemplate @Configuration class RedisConfigure { @Bean fun redisTemplate(connectionFactory: LettuceConnectionFactory): RedisTemplate<String, User> { val redisTemplate = RedisTemplate<String, User>(); redisTemplate.keySerializer = StringRedisSerializer() redisTemplate.valueSerializer = GenericJackson2JsonRedisSerializer() redisTemplate.setConnectionFactory(connectionFactory) return redisTemplate } } 定义数据类型 class User( val id: Long, val name: String, val sex: String, ) { constructor() : this(0L, "", "man") } 操作 @SpringBootTest class SpringbootRedisApplicationTests { @Autowired lateinit var redisTemplate: RedisTemplate<String, User> @Test fun testSerializable() { val user = User(1L, "hello", "man") val ops = redisTemplate.

SpringBoot with MongodbRepository

Spring with MongodbRepository 简单使用 这篇笔记参考自 这篇文章 定义数据类型 class Product( val id: String, val name: String, val price: Int ) 我们可以 手动定义对象存储的集合位置 @Document(collection = "products") class Product( ) 手动定义对象的主键 class Product( @MongoId val id: String ) 定义 Repository @Repository interface ProductRepository: MongoRepository<Product, String> { fun findAllByNameLike(name: String): List<Product> fun findById(id: String): Product? fun existsByName(name: String): Bool } 继承自 MongoRepository 的接口类与 JPA 相似,定义好方法即可, CRUD 方法也与之类似 排序 @Repository interface ProductRepository: MongoRepository<Product, String> { fun findAllByNameLike(name: String, sort: Sort): List<Product> } val sort = Sort.

Rust Mongodb 简单使用

Rust Mongodb 开启同步和异步 同步 mongodb = {version = "2.3.1", features = ["tokio-sync"]} use mongodb::sync::{Client, Collection}; 异步 mongodb = {version = "2.3.1"} use mongodb::{Client, Collection}; 连接 Mongodb impl Client { pub fn with_uri_str(url: impl AsRef<str>) -> Result<Self> } impl Client { pub async fn with_uri_str(url: impl AsRef<str>) -> Result<Self> } 连接到 database impl Client { pub fn database(&self, name: &str) -> Database } 连接到 collection impl Database { pub fn collection<T>(&self, name: &str) -> Collection<T> } collection 操作 异步和同步代码就差一个 await 操作,这里以同步代码为例 find 方法定义