You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter响应式设计异常:屏幕尺寸变化时界面未切换

更新说明:

本文中的代码为正确的最小可复现响应式代码。
问题根源在于导航至CourseDetails响应式页面的父组件,它始终被设置为跳转至MobileCourseDetailsScreen


我开发了一个名为CourseDetails的页面,为实现响应式设计,分别创建了移动端和桌面端页面,并通过一个自适应组件在窗口尺寸变化时切换页面:

class AdaptiveScreen extends StatelessWidget {
  const AdaptiveScreen(
      {super.key,
      required this.mobileLayout,
      required this.desktopLayout});

  final Widget mobileLayout, desktopLayout;
  @override
  Widget build(BuildContext context) {
 // get called when resizing
    return LayoutBuilder(
      builder: (context,constraints){
        double width = MediaQuery.of(context).size.width;
        log(width.toString());
        if (width >= SizeConfig.desktop) {  // desktop = 1200//
          return desktopLayout;
        }
        return mobileLayout;
      },
    );
  }
}

以下是CourseDetails页面的实现:

class CourseDetailsScreen extends StatelessWidget {
  const CourseDetailsScreen({super.key});

  @override
  Widget build(BuildContext context) {
    // this build method never get called when screen resize
    return AdaptiveScreen(
        mobileLayout: MobileCourseDetailsScreen(),
        desktopLayout: DesktopCourseDetailsScreen()
    );

  }
}

移动端和桌面端页面为仅显示文本的容器:

class DesktopCourseDetailsScreen extends StatelessWidget {

   DesktopCourseDetailsScreen({super.key,});

  @override
  Widget build(BuildContext context) {
    return Container(color: Colors.blue, child: Center(child: Text('Desktop Design'),),);
 }
}

class MobileCourseDetailsScreen extends StatelessWidget {
   MobileCourseDetailsScreen(
      {super.key,});

  @override
  Widget build(BuildContext context) {
   return Container(color: Colors.red, child: Center(child: Text('Mobile Design'),),);
 }
}

问题现象: 当调整屏幕尺寸超过桌面端阈值(1200)时,仍显示移动端设计,界面未切换至桌面端,且CourseDetails的build方法在屏幕resize时从未被调用。

内容的提问来源于stack exchange,提问作者A-E

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:04:58