responsive_widget.dart 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import 'package:flutter/material.dart';
  2. import 'package:shared/utils/log_utils.dart';
  3. /// 响应式的布局,根据不同的尺寸展示不同的布局
  4. /// 桌面 - 平板 - 手机的布局判断,手机内部分为全面屏与非全面屏
  5. class ResponsiveWidget extends StatelessWidget {
  6. final Widget? largeScreen; // 大屏幕布局
  7. final Widget? mediumScreen; // 中等屏幕布局
  8. final Widget smallScreen; // 默认手机屏
  9. final Widget? smallFullScreen; // 手机的全面屏手机布局
  10. const ResponsiveWidget({
  11. super.key,
  12. this.largeScreen,
  13. this.mediumScreen,
  14. this.smallFullScreen,
  15. required this.smallScreen,
  16. });
  17. @override
  18. Widget build(BuildContext context) {
  19. return LayoutBuilder(
  20. builder: (context, constraints) {
  21. // 大屏幕
  22. if (constraints.maxWidth > 1200) {
  23. return largeScreen ?? smallScreen;
  24. }
  25. // 中等屏幕
  26. else if (constraints.maxWidth <= 1200 && constraints.maxWidth >= 800) {
  27. return mediumScreen ?? largeScreen ?? smallScreen;
  28. }
  29. // 小屏幕
  30. else {
  31. // 获取屏幕的高度和宽度
  32. final double height = constraints.maxHeight;
  33. final double width = constraints.maxWidth;
  34. final radio = height / width;
  35. final isFullScreen = radio > 1.88;
  36. // 判断是否为全面屏
  37. if (isFullScreen) {
  38. return smallFullScreen ?? smallScreen; // 如果是全面屏,使用全面屏布局
  39. } else {
  40. return smallScreen; // 否则使用默认手机布局
  41. }
  42. }
  43. },
  44. );
  45. }
  46. }