首页
苏兮影视
随笔记
壁纸
更多
直播
时光轴
友联
关于
统计
Search
1
软件添加id功能按钮
708 阅读
2
v2ray节点搭建
508 阅读
3
typecho非常有特色的模块
460 阅读
4
QQxml消息卡片生成源码
421 阅读
5
Linux下提权常用小命令
366 阅读
谈天说地
建站源码
经验教程
资源分享
动漫美图
登录
Search
标签搜索
java
flutter
springboot
rust
安卓
linux
vue
docker
joe
快捷键
git
fish shell
maven
redis
netty
dart
groovy
js
设计模式
rpc
尽意
累计撰写
95
篇文章
累计收到
38
条评论
首页
栏目
谈天说地
建站源码
经验教程
资源分享
动漫美图
页面
苏兮影视
随笔记
壁纸
直播
时光轴
友联
关于
统计
搜索到
30
篇与
的结果
netty自定义编解码器解决黏包半包问题
netty自定义消息体,编码跟解码是相对应的关系,比如编码使用,四个字节的魔数,一字节的版本,一字节的序列化方式,四字节的javabean对象序列化的长度,javabean序列化的内容。那么解码也是按照自定义的字节数拿到数据,前面10个字节都是固定的,只有javabean序列化的内容是不固定的。所以解码必然会有黏包半包问题,假设第一次消息有100个字节,javabean对象序列化的长度为120,那么读取数据是不全的,也就是半包。解决方案,使用netty官方的handel,new LengthFieldBasedFrameDecoder(),帧解码器。当缓存的消息主题不够时,不会将消息向下传递,等待完整的数据才向下传递交给解码器解码。
2024年05月12日
34 阅读
0 评论
1 点赞
flutter 卡在 "Running Gradle task..."
每次启用新的flutter插件都会卡一阵子,网上的说法也都是换maven下载源,即使是换了也还是会卡住。解决方案:在终端中打开flutter项目目录,cd到android目录下,使用gradlew clean清理一下,清理完成后重新build即可。
2024年05月11日
29 阅读
0 评论
1 点赞
2024-05-02
flutter实现封装控制器
在flutter中,尽管已经可以通过状态提升实现小部分的值传递,用回调函数的方法去修改父类的值,在父类调用setstate相当于重新rebuild了父类以及子组件的全部组件,而我们只需要看到子组件的内容发送改变,对此性能上无疑是浪费的。所以需要对组件进行封装,使每次更新只涉及到需要的子组件,这也是性能优化以及解耦的一种解决方案。新建一个controller类继承ChangeNotifier私有化成员变量,设置get set方法,set数据的时候调用notifyListeners函数,通知框架需要更新到新的数据通过ListenableBuilder组件监听需要更新的ChangeNotifier对象每次数据更新使调用set方法都会调用notifyListeners函数,在listenable又会监听到数据的改变,从而进行重绘。
2024年05月02日
40 阅读
0 评论
1 点赞
flutter的状态提升
2024年05月02日
30 阅读
0 评论
0 点赞
2024-05-02
在flutter中,在父组件中修改子组件的内容一般使用状态提升,也就是将子组件需要的变量在父组件的state函数中声明,通过构造函数传参到子组件可以看到这样就可以在父组件中点击按钮改变子组件的值。通过状态提升已经可以解决父组件修改子组件的问题了,那么在子组件怎么修改父组件的值呢?有一种思路是通过函数回调来实现:在dart中函数跟变量等价,允许将函数作为参数来回传递。现在就实现了子组件访问和修改父组件的变量
记录一下flutter的小细节,setState()
setState 只能更新当前widget的状态,当前widget下面还有别的widget情况下,是不会生效子widgetList<String> items = List.generate(10, (index) => "item$index"); class ChatList extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ Expanded( child: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { return ChatItem(chat: items[index]); }, ) )]); } } class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return ChatList(); } void changeChatList(){ setState(){ items.add("new data") } } }这样在Hone Page调用chagngeChatList方法,ChatList中的视图没有变化,可以将items移动到HomePage,并将值通过构造传入,这种做法可以给变量提权修改后 class ChatList extends StatelessWidget { final List<String> items; const ChatList({this.items}) @override Widget build(BuildContext context) { return Column( children: [ Expanded( child: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { return ChatItem(chat: items[index]); }, ) )]); } } class HomePage extends StatelessWidget { List<String> items = List.generate(10, (index) => "item$index"); const HomePage({super.key}); @override Widget build(BuildContext context) { return ChatList(items); } void changeChatList(){ setState(){ items.add("new data") } } }
2024年04月17日
42 阅读
0 评论
1 点赞
1
2
3
...
6