flutter 如何制作响应式小工具?

j2qf4p5b  于 2022-12-14  发布在  Flutter
关注(0)|答案(4)|浏览(184)

我想做一个响应的小部件。我想让它在使用不同的设备时改变为另一种风格的屏幕。
我看过很多像this这样的问题,但仍然找不到答案。答案基本上是通过屏幕宽度来检查设备是移动的设备、平板电脑还是台式机。如果我这样做,当我旋转移动设备时,即使我使用的是移动设备,它也会显示平板电脑风格的屏幕。
但是,我看到一个使用包的answer,而不是方式。但是,我在使用包时得到以下错误:

════════ Exception caught by widgets library ═══════════════════════════════════
LateInitializationError: Field 'deviceType' has not been initialized.
The relevant error-causing widget was
LayoutBuilder
lib/…/responsive.dart:18
════════════════════════════════════════════════════════════════════════════════

我的代码:

import 'package:flutter/material.dart';
import 'package:sizer/sizer.dart';

class Responsive extends StatelessWidget {
  const Responsive({required this.mobile, required this.tablet, required this.desktop, super.key});

  final Widget mobile;
  final Widget tablet;
  final Widget desktop;

  static bool isMobile(BuildContext context) => MediaQuery.of(context).size.width < 600.0 && SizerUtil.deviceType == DeviceType.mobile;

  static bool isTablet(BuildContext context) => MediaQuery.of(context).size.width < 1100.0 && MediaQuery.of(context).size.width >= 600.0 && SizerUtil.deviceType == DeviceType.tablet;

  static bool isDesktop(BuildContext context) => MediaQuery.of(context).size.width >= 1100.0 && SizerUtil.deviceType != DeviceType.mobile && SizerUtil.deviceType == DeviceType.tablet;

  @override
  Widget build(BuildContext context) => LayoutBuilder(
        builder: (context, constraints) => constraints.maxWidth >= 1100.0 && SizerUtil.deviceType != DeviceType.mobile && SizerUtil.deviceType != DeviceType.tablet
            ? desktop
            : constraints.maxWidth < 1100.0 && constraints.maxWidth >= 600.0 && SizerUtil.deviceType == DeviceType.tablet
                ? tablet
                : mobile,
      );
}

如果您需要更多信息,请随时发表评论。
如何做一个响应的小工具?我将感谢任何帮助。提前感谢你!

hfyxw5xn

hfyxw5xn1#

尝试做它喜欢包官方示例. https://github.com/TechnoUrmish/Sizer/blob/master/example/lib/main.dart

Sizer(
      builder: (context, orientation, deviceType) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Sizer',
          theme: ThemeData.light(),
          home: HomeScreen() ,
        );
      },
    );
oiopk7p5

oiopk7p52#

如果你不想使用任何第三方库,那么你可以使用LayoutBuilder。或者你可以使用Sizer库。
Link

qc6wkl3g

qc6wkl3g3#

使用MaterialApp顶部的Sizer小部件对其进行初始化。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Sizer(//this
      builder: (context, orientation, deviceType) {
        return MaterialApp(

我会跟着

class Responsive extends StatelessWidget {
  const Responsive(
      {required this.mobile,
      required this.tablet,
      required this.desktop,
      super.key});

  final Widget mobile;
  final Widget tablet;
  final Widget desktop;

  @override
  Widget build(BuildContext context) =>
      LayoutBuilder(builder: (context, constraints) {
        if (constraints.maxWidth > 600)
          return mobile;
        /// else if (constraints.maxWidth < 1100.0) return tablet; this can be
        else if (constraints.maxWidth >= 600.0 && constraints.maxWidth < 1100.0)
          return tablet;

        return desktop;
      });
}
yv5phkfx

yv5phkfx4#

要使用SizerUtil.deviceType,您必须使用Sizer小部件 Package 应用的父小部件。要使您的应用具有响应性,您可以使用sizer软件包提供的whsp扩展函数。这些函数允许您创建与屏幕大小成比例的小部件和字体。例如:

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

  @override
  Widget build(BuildContext context) {
    return Sizer(
      builder: (context, orientation, deviceType) => MaterialApp(
        home: Scaffold(
          body: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    if (SizerUtil.deviceType == DeviceType.tablet) {
      return Container(width: 100.w, height: 50.h, color: Colors.red);
    } else {
      return Container(width: 60.w, height: 40.h, color: Colors.red);
    }
  }
}

在上面的例子中,如果设备是平板电脑,Container占小部件的100%(100.w)和高度的50%(50.h)。
.sp扩展的工作原理与此类似,只是它是用于字体的。

相关问题