【Flutter&Dart】 拖动边界限改变列宽并且有边界高亮和鼠标结果(12 /100) ...

打印 上一主题 下一主题

主题 1011|帖子 1011|积分 3033

【Flutter&Dart】 拖动改变 widget 的窗口尺寸巨细GestureDetector~简单实现(10 /100)
【Flutter&Dart】 拖动边界限改变列宽类似 vscode 那种拖动改变编辑框窗口巨细(11 /100)
上结果


对比一下vscode的结果:

基本到达交互结果了,就是丝滑度好像差一点点。这个有可能是相干参数没有调试好。后期看看能否改进改进
上代码

  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:logging/logging.dart';
  4. const String tag = 'MyDraggableViewDemo2';
  5. class MyDraggableViewDemo2 extends StatelessWidget {
  6.   const MyDraggableViewDemo2({super.key});
  7.   @override
  8.   Widget build(BuildContext context) {
  9.     return MaterialApp(
  10.       home: Scaffold(
  11.         appBar: AppBar(
  12.           title: Text('MyDraggableViewDemo2'),
  13.         ),
  14.         body: DraggableDemo(),
  15.       ),
  16.     );
  17.   }
  18. }
  19. class DraggableDemo extends StatefulWidget {
  20.   const DraggableDemo({super.key});
  21.   @override
  22.   State<StatefulWidget> createState() {
  23.     return _DraggableDemoState();
  24.   }
  25. }
  26. class _DraggableDemoState extends State<DraggableDemo> {
  27.   double leftWidth = 100.0;
  28.   double height = 200.0;
  29.   bool isResizing = false;
  30.   Timer? _timer;
  31.   bool _isHovered = false;
  32.   void _startTimer() {
  33.     Logger(tag).info('_startTimer called!');
  34.     _timer?.cancel();
  35.     _timer = Timer(const Duration(seconds: 1), () {
  36.       setState(() {
  37.         _isHovered = true;
  38.         Logger(tag).info('Mouse hovered for 2 second!');
  39.       });
  40.     });
  41.   }
  42.   void _cancelTimer() {
  43.     Logger(tag).info('_cancelTimer called!');
  44.     if (isResizing) {
  45.       return;
  46.     }
  47.     _timer?.cancel();
  48.     setState(() {
  49.       _isHovered = false;
  50.     });
  51.   }
  52.   @override
  53.   Widget build(BuildContext context) {
  54.     return Row(children: [
  55.       // 使用 SizedBox 组件来指定左边的组件的宽度
  56.       SizedBox(
  57.         width: leftWidth,
  58.         child: Container(
  59.           color: Colors.blue,
  60.           child: Center(child: Text('左侧菜单')),
  61.         ),
  62.       ),
  63.       // 检测鼠标进入和离开事件
  64.       MouseRegion(
  65.         cursor: SystemMouseCursors.resizeLeftRight, // 设置鼠标形状为剪头
  66.         onEnter: (event) {
  67.           Logger(tag).info('onEnter called!');
  68.           _startTimer();
  69.         },
  70.         onExit: (event) {
  71.           Logger(tag).info('onExit called!');
  72.           _cancelTimer();
  73.         },
  74.         child: // 使用 GestureDetector 组件来包裹分割线
  75.             GestureDetector(
  76.           onHorizontalDragStart: (details) => {
  77.             setState(() {
  78.               isResizing = true;
  79.             })
  80.           },
  81.           // 监听水平方向的拖拽操作
  82.           onHorizontalDragUpdate: (details) {
  83.             // 获取拖拽的距离
  84.             double delta = details.delta.dx;
  85.             // 更新左边的组件的宽度
  86.             leftWidth += delta;
  87.             // 限制左边的组件的宽度在 0 到屏幕宽度之间
  88.             leftWidth = leftWidth.clamp(0.0, MediaQuery.of(context).size.width);
  89.             // 重绘组件
  90.             setState(() {});
  91.           },
  92.           onHorizontalDragCancel: () => {
  93.             setState(() {
  94.               isResizing = false;
  95.             })
  96.           },
  97.           onHorizontalDragEnd: (details) => {
  98.             Logger(tag).info('onHorizontalDragEnd called!'),
  99.             setState(() {
  100.               isResizing = false;
  101.             })
  102.           },
  103.           child: VerticalDivider(
  104.             width: _isHovered ? 3 : 2,
  105.             thickness: _isHovered ? 3 : 2,
  106.             color: Colors.grey[_isHovered ? 100 : 700],
  107.           ),
  108.         ),
  109.       ),
  110. // 使用 Expanded 组件来包裹右边的组件
  111.       Expanded(
  112.         child: Container(
  113.           color: Colors.red,
  114.           child: Center(child: Text('右侧工作区')),
  115.         ),
  116.       ),
  117.     ]);
  118.   }
  119. }
复制代码
结果已经完成,也没啥好说的了,晚安
=========END

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表