Flutter CSS单位转换插件css_units的使用

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

Flutter CSS单位转换插件css_units的使用

标题

CSS Units

内容

添加一个用于转换CSS视口单位(vmin, vmax, vw, vh, rem)的转换器。

描述

方便地设置尺寸相对于屏幕或LayoutBuilders BoxConstraints。

示例代码

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

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    CssViewportUnits.initContextSizes(context);
    return const MaterialApp(
      title: 'Example app for css_units package',
      debugShowCheckedModeBanner: false,
      home: MyAppContent(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 初始化上下文大小
    CssViewportUnits.initContextSizes(context);

    return Scaffold(
      appBar: AppBar(title: const Text("Example css_units package")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SizedBox(
              height: 6.vmin,
              child: Text(
                '60 vmin width',
                style: TextStyle(fontSize: 5.vmin),
              ),
            ),
            Container(
              alignment: Alignment.center,
              width: 60.vmin,
              height: 60.vmin,
              margin: EdgeInsets.all(11.vmin), // 注意:这里的间距应该是11.vmin,而不是1.vmin
              decoration: BoxDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.circular(11.vmin), // 注意:这里的半径应该是11.vmin,而不是1.vmin
              ),
              child: Text(
                "Text 2 rem",
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 2.rem,
                  color: Colors.white,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
            SizedBox(height: 6.v.min), // 注意:这里的间距应该是6.v.min,而不是6.vmin
          ],
        ),
      ),
    );
  }
}

使用说明

注意!在使用相对尺寸之前,你应该总是调用CssViewportUnits.initContextSizes(context);

特性

  • 可读性!

安装

更改pubspec.yaml(并运行隐式pub get):

dependencies:
  css_units: <latest_version>

或者从GitHub获取最新版本:

dependencies:
  css_units:
    git:
      url: https://github.com/devmaslove/css_units

示例演示

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

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    CssViewportUnits.initContextSizes(context);
    return const MaterialApp(
      title: 'Example app for css_units package',
      debugShowCheckedModeBanner: false,
      home: MyAppContent(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 初始化上下文大小
    CssViewportUnits.initContextSizes(context);

    return Scaffold(
      appBar: AppBar(title: const Text("Example css_units package")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SizedBox(
              height: 6.v.min, // 细节调整为6.v.min
              child: Text(
                '60 vmin width',
                style: TextStyle(fontSize: 5.v.min), // 细节调整为5.v.min
              ),
            ),
            Container(
              alignment: Alignment.center,
              width: 60.v.min, // 细节调整为60.v.min
              height: 60.v.min, // 细节调整为60.v.min
              margin: EdgeInsets.all(11.v.min), // 细节调整为11.v.min
              decoration: BoxDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.circular(11.v.min), // 细节调整为11.v.min
              ),
              child: Text(
                "Text 2 rem",
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 2.rem, // 细节调整为2.rem
                  color: Colors.white,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
            SizedBox(height: 6.v.min), // 细节调整为6.v.min
          ],
        ),
      ),
    );
  }
}

更多关于Flutter CSS单位转换插件css_units的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter CSS单位转换插件css_units的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用css_units插件进行CSS单位转换的代码案例。这个插件可以帮助你将CSS单位(如px, em, rem等)转换为Flutter中使用的单位(如逻辑像素)。

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

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

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

接下来,下面是一个示例代码,展示了如何使用css_units插件进行单位转换:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('CSS Units Conversion Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Convert 16px to logical pixels:',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              CssUnitsConversionExample(),
            ],
          ),
        ),
      ),
    );
  }
}

class CssUnitsConversionExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 假设设计稿是基于375px宽度的屏幕
    final designBaseWidth = 375.0;
    final screenWidth = MediaQuery.of(context).size.width;
    final scaleFactor = screenWidth / designBaseWidth;

    // 将16px转换为逻辑像素
    double pxValue = 16.0;
    double logicalPixels = CssUnits.pxToLogicalPixels(pxValue, scaleFactor: scaleFactor);

    return Text(
      '16px is equal to ${logicalPixels.toStringAsFixed(2)} logical pixels',
      style: TextStyle(fontSize: 18),
    );
  }
}

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

  1. pubspec.yaml文件中添加了css_units依赖。
  2. 创建了一个Flutter应用,并在首页中展示了如何使用css_units插件进行单位转换。
  3. CssUnitsConversionExample组件中,我们首先定义了设计稿的基准宽度(通常是设计稿的宽度,例如375px),然后获取了当前屏幕的宽度。
  4. 通过屏幕宽度和设计稿宽度的比例计算出缩放因子(scaleFactor)。
  5. 使用CssUnits.pxToLogicalPixels方法将16px转换为逻辑像素,并显示了转换结果。

请注意,css_units插件可能具有更多的功能和转换方法,你可以根据具体需求查阅其文档以获取更多信息。

回到顶部