generated from dellevin/template
42 lines
1.4 KiB
Dart
42 lines
1.4 KiB
Dart
import 'dart:io' show Platform;
|
||
import 'package:flutter/widgets.dart';
|
||
|
||
/// 响应式布局断点工具
|
||
class Breakpoint {
|
||
/// ≥600dp: 平板布局(常驻侧边栏 + NavigationRail)
|
||
static const double tablet = 600.0;
|
||
|
||
/// ≥900dp: 宽屏内容区(列表-详情并排显示)
|
||
static const double wideContent = 900.0;
|
||
|
||
/// ≥1200dp: 桌面布局(侧边导航 + 宽内容区)
|
||
static const double desktop = 1200.0;
|
||
|
||
static bool isTablet(BuildContext context) =>
|
||
Platform.isWindows || MediaQuery.sizeOf(context).width >= tablet;
|
||
|
||
static bool isPhone(BuildContext context) =>
|
||
!Platform.isWindows && MediaQuery.sizeOf(context).width < tablet;
|
||
|
||
/// 是否使用宽屏内容布局(列表+详情并排)
|
||
/// 桌面模式下始终为 true(列表已在第二栏,第三栏只显示详情)
|
||
static bool isWideContent(BuildContext context) =>
|
||
Platform.isWindows || MediaQuery.sizeOf(context).width >= wideContent;
|
||
|
||
/// 是否使用桌面布局(侧边导航 + 宽内容区)
|
||
/// Windows 平台始终使用桌面布局
|
||
static bool isDesktop(BuildContext context) =>
|
||
Platform.isWindows || MediaQuery.sizeOf(context).width >= desktop;
|
||
}
|
||
|
||
/// 根据可用宽度动态计算网格列数
|
||
int responsiveCrossAxisCount(
|
||
double availableWidth, {
|
||
double minItemWidth = 160,
|
||
int minCount = 2,
|
||
int maxCount = 6,
|
||
}) {
|
||
final count = (availableWidth / minItemWidth).floor();
|
||
return count.clamp(minCount, maxCount);
|
||
}
|