Flutter布局插件flutter_flexui的使用

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

Flutter布局插件flutter_flexui的使用

flutter_flexui 是一个用于构建适应不同屏幕尺寸的灵活UI的Flutter插件。它支持自适应文本大小、根据屏幕尺寸替换小部件等功能。

特性

  • 自适应文本大小
  • 根据不同的屏幕尺寸替换小部件
  • 自适应行(改变列数)
  • 设备类型检测,包括电视

开始使用

要在项目中使用该插件,请在 pubspec.yaml 文件中添加 flutter_flexui 作为依赖项:

dependencies:
  flutter_flexui: <latest_version>

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

导入库

import 'package:flutter_flexui/flutter_flexui.dart';

示例Demo

下面是一个完整的示例demo,展示了如何使用 flutter_flexui 中的主要组件。

完整示例代码

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ListView(
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: <Widget>[
                  const FlexText(
                    'You have pushed the button this many times:',
                    styleXs: TextStyle(fontWeight: FontWeight.w100, fontSize: 10),
                    styleSm: TextStyle(fontWeight: FontWeight.w200, fontSize: 12),
                    styleMd: TextStyle(fontWeight: FontWeight.w600, fontSize: 16),
                    styleLg: TextStyle(fontWeight: FontWeight.w900, fontSize: 22),
                  ),
                  FlexText(
                    '$_counter',
                    styleXs: const TextStyle(fontWeight: FontWeight.w100, fontSize: 10),
                    styleSm: const TextStyle(fontWeight: FontWeight.w200, fontSize: 12),
                    styleMd: const TextStyle(fontWeight: FontWeight.w600, fontSize: 16),
                    styleLg: const TextStyle(fontWeight: FontWeight.w900, fontSize: 22),
                  ),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text("FlexWidget", style: Theme.of(context).textTheme.headlineMedium),
            ),
            Center(
              child: FlexWidget(
                xs: Container(color: Colors.green, width: 200.0, height: 200.0),
                sm: Container(color: Colors.orange, width: 200.0, height: 200.0),
                md: Container(color: Colors.red, width: 200.0, height: 200.0),
                lg: Container(color: Colors.purple, width: 200.0, height: 200.0),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text("FlexRow", style: Theme.of(context).textTheme.headlineMedium),
            ),
            FlexRow(
              colLg: 6,
              colMd: 3,
              colSm: 2,
              colXs: 1,
              colMainAxisAlignment: MainAxisAlignment.spaceEvenly,
              colVerticalDirection: VerticalDirection.down,
              colMainAxisSize: MainAxisSize.max,
              rowMainAxisAlignment: MainAxisAlignment.spaceAround,
              rowVerticalDirection: VerticalDirection.down,
              rowMainAxisSize: MainAxisSize.max,
              children: <Widget>[
                Text("Width: ${context.screenWidth}"),
                Text("Height: ${context.screenHeight}"),
                Text("PixelRation: ${context.pixelRatio}"),
                Text("Diagonal: ${context.diagonalInches}"),
                Text("Screen: ${context.screenSize.toString()}"),
                FutureBuilder<DeviceType>(
                  future: context.deviceType,
                  builder: (context, snapshot) {
                    return Text("Device: ${snapshot.data?.toString()}");
                  },
                ),
              ],
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

主要组件介绍

FlexRow

FlexRow 是一个自适应行布局组件,可以根据屏幕宽度调整列数。

FlexRow(
  colLg: 6,
  colMd: 3,
  colSm: 2,
  colXs: 1,
  colMainAxisAlignment: MainAxisAlignment.spaceEvenly,
  colVerticalDirection: VerticalDirection.down,
  colMainAxisSize: MainAxisSize.max,
  rowMainAxisAlignment: MainAxisAlignment.spaceAround,
  rowVerticalDirection: VerticalDirection.down,
  rowMainAxisSize: MainAxisSize.max,
  children: <Widget>[
    Text("Width: ${context.screenWidth}"),
    Text("Height: ${context.screenHeight}"),
    Text("PixelRation: ${context.pixelRatio}"),
    Text("Diagonal: ${context.diagonalInches}"),
    Text("Screen: ${context.screenSize.toString()}"),
    FutureBuilder<DeviceType>(
      future: context.deviceType,
      builder: (context, snapshot) {
        return Text("Device: ${snapshot.data?.toString()}");
      },
    ),
  ],
);

FlexText

FlexText 是一个自适应文本组件,可以根据屏幕大小调整字体样式和大小。

FlexText(
  'Test',
  styleSm: TextStyle(fontWeight: FontWeight.w200, fontSize: 12),
  styleMd: TextStyle(fontWeight: FontWeight.w600, fontSize: 16),
  styleLg: TextStyle(fontWeight: FontWeight.w900, fontSize: 22),
);

FlexWidget

FlexWidget 可以根据设备屏幕大小显示不同的小部件。

FlexWidget(
  xs: Container(color: Colors.green, width: 200.0, height: 200.0),
  sm: Container(color: Colors.orange, width: 200.0, height: 200.0),
  md: Container(color: Colors.red, width: 200.0, height: 200.0),
  lg: Container(color: Colors.purple, width: 200.0, height: 200.0),
);

FlexBuilder

FlexBuilder 提供了基于屏幕尺寸构建小部件的能力。

FlexBuilder(
  builder: (context, screen) {
    return Container();
  },
);

工具函数

Screen

提供了获取屏幕信息的各种方法:

// 获取屏幕尺寸类型
context.screenSize;

// 获取MediaQueryData
context.mediaQuery;

// 获取屏幕方向
context.orientation;

// 屏幕宽度
context.screenWidth;

// 屏幕高度
context.screenHeight;

// 像素比例
context.pixelRatio;

// 屏幕对角线长度
context.diagonal;

// 屏幕对角线英寸
context.diagonalInches;

// 状态栏高度
context.statusBarHeight;

// 底部栏高度
context.bottomBarHeight;

// 根据屏幕尺寸获取值
context.valueByScreen(xsObject, smObject, mdObject, lgObject);

Device

提供了判断设备类型的函数:

context.isDesktop;
context.isTablet;
context.isMobile;
context.isWeb;
context.isWindows;
context.isLinux;
context.isMacOS;
context.isAndroid;
context.isFuchsia;
context.isIOS;

// 获取设备类型
context.deviceType;

通过这些功能,您可以轻松地为不同屏幕尺寸和设备类型创建灵活且响应式的UI。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用flutter_flexui布局插件的示例代码。flutter_flexui是一个强大的Flutter布局插件,它提供了一些高级的布局组件,可以帮助开发者更轻松地创建复杂的用户界面。

首先,你需要在你的pubspec.yaml文件中添加flutter_flexui依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_flexui: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,我们来看一个具体的代码示例,展示如何使用flutter_flexui中的一些组件。

import 'package:flutter/material.dart';
import 'package:flutter_flexui/flexui.dart';

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

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

class FlexUIDemoScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter FlexUI Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用 FlexColumnLayout 创建一个垂直布局
            FlexColumnLayout(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                FlexUIItem(
                  flex: 1,
                  child: Container(
                    height: 100,
                    color: Colors.red,
                    child: Center(child: Text('Red Box', style: TextStyle(color: Colors.white))),
                  ),
                ),
                FlexUIItem(
                  flex: 2,
                  child: Container(
                    height: 100,
                    color: Colors.green,
                    child: Center(child: Text('Green Box', style: TextStyle(color: Colors.white))),
                  ),
                ),
                FlexUIItem(
                  flex: 1,
                  child: Container(
                    height: 100,
                    color: Colors.blue,
                    child: Center(child: Text('Blue Box', style: TextStyle(color: Colors.white))),
                  ),
                ),
              ],
            ),

            SizedBox(height: 20),

            // 使用 FlexRowLayout 创建一个水平布局
            FlexRowLayout(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                FlexUIItem(
                  flex: 1,
                  child: Container(
                    width: 100,
                    color: Colors.yellow,
                    child: Center(child: Text('Yellow Box')),
                  ),
                ),
                FlexUIItem(
                  flex: 1,
                  child: Container(
                    width: 100,
                    color: Colors.purple,
                    child: Center(child: Text('Purple Box')),
                  ),
                ),
                FlexUIItem(
                  flex: 1,
                  child: Container(
                    width: 100,
                    color: Colors.orange,
                    child: Center(child: Text('Orange Box')),
                  ),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们展示了如何使用FlexColumnLayoutFlexRowLayout来创建垂直和水平布局。FlexUIItem是这些布局中的子项,通过flex属性来控制子项在主轴上的占比。

  • FlexColumnLayout创建了一个垂直布局,其中包含了三个不同高度的子项(红色、绿色和蓝色盒子)。
  • FlexRowLayout创建了一个水平布局,其中包含了三个等宽的子项(黄色、紫色和橙色盒子),并且使用了MainAxisAlignment.spaceAround来在子项之间添加间距。

这些只是flutter_flexui提供的一些基本功能,你可以根据实际需求进一步探索和使用这个插件的其他高级特性。

回到顶部