Flutter尺寸获取插件app_dimen的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter尺寸获取插件app_dimen的使用

初始化

在使用app_dimen插件之前,需要进行初始化。这通常在main函数中完成。

void main() {
  DimenInitializer.init();
  runApp(const MyApp());
}

使用Scaffold或屏幕尺寸创建响应式UI

你可以使用context.dp()方法来获取动态像素值,这样可以根据屏幕大小调整UI元素的尺寸。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          width: context.dp(200), // 动态宽度
          height: context.dp(200), // 动态高度
          padding: EdgeInsets.all(context.dp(24)), // 动态内边距
          decoration: BoxDecoration(
            color: Colors.deepOrange,
            borderRadius: BorderRadius.circular(context.dp(24)), // 动态圆角半径
          ),
          alignment: Alignment.center,
          margin: EdgeInsets.all(context.dp(24)), // 动态外边距
          child: Text(
            "${context.dp(24).toInt()}", // 动态字体大小
            textAlign: TextAlign.center,
            style: TextStyle(
              // fontWeight: context.boldFontWeight,
              fontSize: context.dp(24), // 动态字体大小
            ),
          ),
        ),
      ),
    );
  }
}

根据屏幕类型创建响应式UI

通过ScreenConstraints可以进一步根据屏幕类型(例如手机、平板等)创建更复杂的响应式UI。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          width: context.scaffoldWidth, // 屏幕宽度
          height: context.scaffoldHeight, // 屏幕高度
          child: Column(
            children: [
              Expanded(
                child: Row(
                  children: [
                    Expanded(
                      child: Container(
                        color: Colors.green,
                        alignment: Alignment.center,
                        height: double.infinity,
                        child: Text(
                          context.dp(32).toStringAsFixed(2), // 动态字体大小
                          style: TextStyle(
                            fontSize: context.dp(32), // 动态字体大小
                          ),
                        ),
                      ),
                    ),
                    Expanded(
                      child: DimensionalBox<SizeDimen>(
                        primary: false,
                        name: DefaultDimenKeys.fontSize,
                        builder: (context, dimen) {
                          return Container(
                            color: Colors.greenAccent,
                            alignment: Alignment.center,
                            height: double.infinity,
                            child: Text(
                              "$SizeDimen(${dimen.largest})", // 动态字体大小
                              style: TextStyle(
                                fontSize: dimen.largest, // 动态字体大小
                              ),
                            ),
                          );
                        },
                      ),
                    ),
                  ],
                ),
              ),
              Expanded(
                child: DimenLayout(
                  primary: false,
                  builder: (context, data) {
                    ConstraintDimen appbar = data.appbar;
                    ConstraintDimen bottom = data.bottom;
                    ConstraintDimen button = data.button;
                    SizeDimen corner = data.corner;
                    SizeDimen divider = data.divider;
                    SizeDimen fontSize = data.fontSize;
                    WeightDimen fontWeight = data.fontWeight;
                    SizeDimen icon = data.icon;
                    ConstraintDimen image = data.image;
                    SizeDimen indicator = data.indicator;
                    SizeDimen logo = data.logo;
                    SizeDimen margin = data.margin;
                    SizeDimen padding = data.padding;
                    ConstraintDimen scaffold = data.scaffold;
                    SizeDimen size = data.size;
                    SizeDimen spacing = data.spacing;
                    SizeDimen stroke = data.stroke;
                    return Container(
                      color: Colors.green,
                      alignment: Alignment.center,
                      height: double.infinity,
                      child: Text(
                        "$DimenLayout (${data.dp(32)})", // 动态字体大小
                        style: TextStyle(
                          fontSize: data.dp(32), // 动态字体大小
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter尺寸获取插件app_dimen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter尺寸获取插件app_dimen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用app_dimen插件来获取屏幕尺寸和其他尺寸信息的示例代码。app_dimen插件允许你从dimen.xml文件中读取Android资源值,这在处理屏幕尺寸和布局时非常有用。

首先,确保你已经在pubspec.yaml文件中添加了app_dimen依赖:

dependencies:
  flutter:
    sdk: flutter
  app_dimen: ^x.y.z  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,在Android项目的res/values/dimen.xml文件中定义一些尺寸资源。例如:

<!-- res/values/dimen.xml -->
<resources>
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="text_size_large">24sp</dimen>
</resources>

现在,你可以在Flutter代码中使用app_dimen插件来获取这些尺寸值。下面是一个完整的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App Dimen Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double? activityHorizontalMargin;
  double? activityVerticalMargin;
  double? textSizeLarge;

  @override
  void initState() {
    super.initState();
    _loadDimens();
  }

  Future<void> _loadDimens() async {
    final dimenProvider = AppDimen();
    try {
      activityHorizontalMargin = await dimenProvider.get('activity_horizontal_margin');
      activityVerticalMargin = await dimenProvider.get('activity_vertical_margin');
      textSizeLarge = await dimenProvider.get('text_size_large');

      setState(() {});
    } catch (e) {
      print('Error loading dimens: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter App Dimen Example'),
      ),
      body: Padding(
        padding: EdgeInsets.symmetric(
          horizontal: activityHorizontalMargin ?? 16.0,  // Default value if not loaded
          vertical: activityVerticalMargin ?? 16.0,     // Default value if not loaded
        ),
        child: Center(
          child: Text(
            'Hello, Flutter!',
            style: TextStyle(fontSize: textSizeLarge ?? 24.0),  // Default value if not loaded
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml文件中添加了app_dimen依赖。
  2. 在Android项目的dimen.xml文件中定义了几个尺寸资源。
  3. 创建了一个Flutter应用,并在MyHomePage组件中使用了app_dimen插件来获取这些尺寸值。
  4. 使用Futureasync/await语法来异步加载这些尺寸值,并在加载完成后更新UI。

请注意,app_dimen插件主要用于从Android的dimen.xml文件中读取值。如果你需要跨平台(如iOS)的尺寸处理,可能需要考虑其他方法或插件。

回到顶部