Files
xianyan/lib/core/layout/triple_column_view.dart
Developer ca68fe29c7 chore: 批量整理优化项目代码与配置
- 新增模型目录占位文件与翻译类型拆分
- 调整路由配置与桌面端窗口初始化
- 移除多处冗余图表配置项
- 重构右侧面板注册表与三栏布局组件
- 添加智能AppBar、拖拽书签等新功能组件
- 优化安卓编译配置与多平台插件注册
- 新增翻译覆盖率测试与共享组件
- 格式化代码与修复静态分析警告
2026-05-29 10:08:02 +08:00

74 lines
2.2 KiB
Dart

/// ============================================================
/// 闲言APP — 三栏布局组件
/// 创建时间: 2026-05-29
/// 更新时间: 2026-05-29
/// 作用: 超宽屏(>=1400px)三栏布局:左侧列表+中间详情+右侧辅助面板
/// 上次更新: 初始创建
/// ============================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'split_divider.dart';
class TripleColumnView extends ConsumerStatefulWidget {
const TripleColumnView({
required this.leftPanel,
required this.centerPanel,
required this.rightPanel,
super.key,
});
final Widget leftPanel;
final Widget centerPanel;
final Widget rightPanel;
@override
ConsumerState<TripleColumnView> createState() => _TripleColumnViewState();
}
class _TripleColumnViewState extends ConsumerState<TripleColumnView> {
double _leftRatio = 0.25;
double _centerRatio = 0.40;
@override
Widget build(BuildContext context) {
final width = MediaQuery.of(context).size.width;
final leftWidth = width * _leftRatio;
final centerWidth = width * _centerRatio;
return Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SizedBox(width: leftWidth, child: widget.leftPanel),
SplitDivider(
currentPosition: _leftRatio,
onPositionChanged: (newRatio) {
setState(() {
final delta = newRatio - _leftRatio;
_leftRatio = newRatio.clamp(0.15, 0.35);
_centerRatio = (_centerRatio - delta).clamp(0.25, 0.55);
});
},
minPosition: 0.15,
maxPosition: 0.35,
),
SizedBox(width: centerWidth, child: widget.centerPanel),
SplitDivider(
currentPosition: _leftRatio + _centerRatio,
onPositionChanged: (newRatio) {
setState(() {
final combinedRatio = newRatio;
_centerRatio =
(combinedRatio - _leftRatio).clamp(0.25, 0.55);
});
},
minPosition: _leftRatio + 0.25,
maxPosition: _leftRatio + 0.55,
),
Expanded(child: widget.rightPanel),
],
);
}
}