让应用程序在所有移动设备上响应的方法有哪些?

What are the ways to make an application responsive in all mobile devices?

我打算制作一个应能响应所有移动设备的应用程序。 推荐一些方法。

避免使用固定的高度和宽度值。 更喜欢在列、行或堆栈中使用 Expanded、Flexible、SizedBox.expand()。 如果可能,还可以使用 flutter web 进行开发和测试。在那里您可以轻松检查响应能力。

除了来自 jannik 的

您可能还想查看以下资源:

为了使应用程序响应,您需要使用 MediaQuery.of(context).size 来获取应用程序所在设备的尺寸 运行,因此您可以做出一些事情您希望根据大小和内容获得不同视图的点。

我已经使用本教程构建了响应式 Flutter 应用程序:https://www.filledstacks.com/post/building-a-responsive-ui-architecture-in-flutter/

其背后的想法是创建一个 Widget,它可以容纳 3 个不同的 Widget,适用于手机、平板电脑和桌面。

我也在使用 responsive_framework 包 https://pub.dev/packages/responsive_framework

使用该包,您可以定义不同的断点:

import 'package:responsive_framework/responsive_framework.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: (context, child) => ResponsiveWrapper.builder(
          child,
          maxWidth: 1200,
          minWidth: 480,
          defaultScale: true,
          breakpoints: [
            ResponsiveBreakpoint.resize(480, name: MOBILE),
            ResponsiveBreakpoint.autoScale(800, name: TABLET),
            ResponsiveBreakpoint.resize(1000, name: DESKTOP),
          ],
          background: Container(color: Color(0xFFF5F5F5))),
      initialRoute: "/",
    );
  }
}

然后你可以使用这个断点来决定应该显示哪个布局:

class ScreenTypeFrame extends StatelessWidget {
  final Widget mobile;
  final Widget? tablet;
  final Widget? desktop;
  
  ScreenTypeFrame({
    Key? key,
    required this.mobile,
    this.tablet,
    this.desktop,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    if (desktop != null && _isDesktop(context)) {
      return desktop!;
    } else if (tablet != null && _isTablet(context)) {
      return tablet!;
    } else {
      return mobile;
    }
  }

  bool _isDesktop(BuildContext context) {
    return ResponsiveWrapper.of(context).isLargerThan(TABLET);
  }

  bool _isTablet(BuildContext context) {
    return ResponsiveWrapper.of(context).isLargerThan(MOBILE);
  }
}


class ResponsivePage extends StatelessWidget {
  const ResponsivePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ScreenTypeFrame(
      mobile: Text("Mobil"),
      tablet: Text("Tablet"),
      desktop: Text("Desktop"),
    );
  }
}

这不是完整的代码。还有helper layout可以为手机、平板、桌面创建不同的脚手架,有不同的菜单等等。

ScreenTypeFrame 小部件可以像这样增强:

@override
  Widget build(BuildContext context) {
    Widget bodyWidget = _getBodyWidget(context);

    if (_isDesktop(context)) {
      return DesktopScaffold(
        body: bodyWidget,
        title: title,
      );
    } else if (_isTablet(context)) {
      return TabletScaffold(
        body: bodyWidget,
        title: title,
      );
    }
    return MobileScaffold(
      body: bodyWidget,
      title: title,
    );
  }
  
  Widget _getBodyWidget(BuildContext context) {
    if (desktop != null && _isDesktop(context)) {
      return desktop!;
    } else if (tablet != null && _isTablet(context)) {
      return tablet!;
    } else {
      return mobile;
    }

}