Flutter布局管理插件flexiflow的使用

Flutter布局管理插件flexiflow的使用

Flexiflow Package

Pub.dev Badge GitHub Build Badge Effective Dart Badge MIT License Badge Flutter Platform Badge

Web Badge Android Badge iOS Badge MacOS Badge Windows Badge Linux Badge

可用语言

English Version Versão em Português


Flexiflow是一个库,可以让你在应用中创建响应式的流布局,为不同类型的设备和屏幕提供适应性的变化。

关于 #

Flexiflow基于一个基础设计的概念来创建响应式的流布局。从这个基础设计开始,库可以生成针对不同设备(如手机、平板和桌面)的适应性变化。此外,Flexiflow还会根据不同的屏幕大小调整小部件的尺寸,保持与原始设计的恒定比例。

通过Flexiflow,你可以轻松地为你的应用开发响应式的流布局,无需复杂的计算并提高代码可读性。库的灵活性允许你为每种类型的设备创建特定的变化,从而实现高效的响应式布局,适用于多种屏幕尺寸。这有助于为每个设备提供独特的用户体验。

安装 #

要安装Flexiflow,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flexiflow: ^VERSION

VERSION替换为包的最新版本。你可以在Pub.dev上的包页面找到最新的Flexiflow版本。

之后,运行flutter pub get命令以下载项目依赖。

现在,只需导入Flexiflow到你的项目并开始享受简单快速的响应式布局的好处:

import 'package:flexiflow/flexiflow.dart';

用法 #

Flexiflow分为两个部分:“Flexi”和“Flow”。术语“Flexi”来自灵活性,负责为你的小部件提供响应式能力。而“Flow”部分,源自单词“flow”,负责为不同类型的设备创建定制的变化。

响应式 #

为了使你的小部件具有响应式能力,第一步是将FlexiFlow小部件引入你的应用。该FlexiFlow小部件在建立应用的基础设计方面起着关键作用,作为创建响应式流布局的参考点。为此,初始设置时只需通过designSize参数提供基础设计的尺寸:

void main() {
  runApp(
    FlexiFlow(
      designSize: Size(1920, 1080),
      child: const MyApp(),
    ),
  );
}

在此步骤之后,你可以使用包提供的扩展功能使你的小部件具有响应式能力。为此,只需使用对应于所需类型响应性的变量,并为其分配一个数值:

final double width = 100.w;
final double height = 100.h;
final double fontSize = 100.sp;

Flexiflow提供了七种不同的响应式类型,每种类型都有其特定的调整方式:

  • wwidth:响应于基础设计的宽度。
  • hheight:响应于基础设计的高度。
  • sp:响应于基础设计的字体大小。
  • dp:响应于设备的像素密度。
  • wPercwidthPercentage:响应于基础设计宽度的百分比。
  • hPercheightPercentage:响应于基础设计高度的百分比。
  • sqrsquared:响应于基础设计较小的维度,通常用于创建正方形的小部件。

此外,Flexiflow还提供了通过minmax 参数设置响应式最小和最大限制的功能:

final double width = 100.limW(min: 50, max: 200);
final double height = 100.limH(min: 50, max: 200);
final double fontSize = 100.limSp(min: 50, max: 200);

这对于防止响应式值变得过小或过大非常有用,从而提供更好的用户体验。

可选的minmax 参数可以应用于以下扩展:

  • limWlimitedWidth:限制对基础设计宽度的响应。
  • limHlimitedHeight:设定对基础设计高度的响应限制。
  • limSplimitedSp:设定对基础设计字体大小的响应限制。
  • limDplimitedDp:控制对设备像素密度的响应。
  • limWPerclimitedWidthPercentage:对基础设计宽度百分比的响应施加限制。
  • limHPerclimitedHeightPercentage:对基础设计高度百分比的响应进行调节。
  • limSqrlimitedSquared:对基础设计较小维度的响应施加限制,通常用于维持小部件为正方形格式。

#

为了为不同类型设备创建定制的变化,FlowScreen小部件是理想工具。此小部件负责为手机、平板电脑和桌面生成特定的变体,提供在每个平台上优化的体验。

FlowScreen(
    mobileChild: const MobileScreen(),
    tabletChild: const TabletScreen(),
    desktopChild: const DesktopScreen(),
),

如果你想创建FlowScreen之外的自定义变体,IFlow接口提供了必要的灵活性。要实现自己的流,只需创建一个继承自IFlow接口的类,并覆盖getCurrentFlowgetCurrentType方法。

class CustomFlow extends IFlow<DevicesTypes> {

  CustomFlow({
    required BuildContext context,
    required Widget mobileChild,
    required Widget tabletChild,
    required Widget desktopChild,
  })
      : _context = context,
        _mobileChild = mobileChild,
        _tabletChild = tabletChild,
        _desktopChild = desktopChild;

  final BuildContext _context;
  final Widget _mobileChild;
  final Widget _tabletChild;
  final Widget _desktopChild;

  [@override](/user/override)
  Widget getCurrentFlow(DevicesTypes type) {
    return switch (type) {
      DevicesTypes.mobile => _mobileChild,
      DevicesTypes.tablet => _tabletChild,
      DevicesTypes.desktop => _desktopChild
    };
  }

  [@override](/user/override)
  DevicesTypes getCurrentType() {
    final size = MediaQuery.sizeOf(_context);
    if (size.width < 600) {
      return DevicesTypes.mobile;
    } else if (size.width < 1024) {
      return DevicesTypes.tablet;
    } else {
      return DevicesTypes.desktop;
    }
  }

在创建了自定义类并继承IFlow接口后,很容易将其集成到FlowBuilder中。只需将此类的一个实例作为flow参数传递给FlowBuilder即可:

FlowBuilder(
    flow: CustomFlow(
        context: context,
        mobileChild: const MobileScreen(),
        tabletChild: const TabletScreen(),
        desktopChild: const DesktopScreen(),
    ),
),

记得自定义流可以非常灵活地进行,甚至允许用户进行自己的定制。

示例 #

要查看Flexiflow的实际使用示例,请访问我们的Flow Lab

贡献 #

贡献总是受欢迎的!如果你想要为Flexiflow做出贡献,请访问我们的GitHub仓库

问题和建议 #

你可以在我们的问题页面报告问题和提出新功能建议。

许可证 #

Flexiflow遵循MIT许可证。详情请参阅LICENSE文件

致谢 #

我们感谢Arthur Goelzer为项目README所做的艺术贡献。

示例代码

import 'package:flexiflow/flexiflow.dart';
import 'package:flexiflow_example/presentation/base_flow_lab/base_flow_lab_page.dart';
import 'package:flexiflow_example/presentation/custom_flow_lab/custom_flow_lab_page.dart';
import 'package:flexiflow_example/presentation/responsive_lab/responsive_lab_page.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(
    FlexiFlow(
      designSize: Size(1920, 1080),
      child: const MyApp(),
    ),
  );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flexiflow Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigoAccent),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({
    super.key,
  });

  [@override](/user/override)
  State&lt;HomePage&gt; createState() =&gt; _HomePageState();
}

class _HomePageState extends State&lt;HomePage&gt; {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return Scaffold(
      appBar: AppBar(
        backgroundColor: theme.colorScheme.inversePrimary,
        title: Text('FlexiFlow Example'),
      ),
      body: CustomScrollView(
        slivers: [
          SliverFillRemaining(
            hasScrollBody: false,
            child: SizedBox(
              width: double.infinity,
              child: Padding(
                padding: const EdgeInsets.all(24),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      'Choose your laboratory:',
                      style: theme.textTheme.titleLarge,
                      textAlign: TextAlign.center,
                    ),
                    Padding(
                      padding: const EdgeInsets.symmetric(
                        vertical: 16,
                      ),
                      child: SizedBox(
                        width: 200.limW(
                          min: 200,
                          max: 250,
                        ),
                        child: ElevatedButton(
                          onPressed: () =&gt; Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (context) =&gt; const ResponsiveLabPage(),
                            ),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.all(8),
                            child: Text(
                              'Responsive Lab',
                              style: theme.textTheme.bodyLarge,
                            ),
                          ),
                        ),
                      ),
                    ),
                    SizedBox(
                      width: 200.limW(
                        min: 200,
                        max: 250,
                      ),
                      child: ElevatedButton(
                        onPressed: () =&gt; Navigator.of(context).push(
                          MaterialPageRoute(
                              builder: (context) =&gt; const BaseFlowLabPage()),
                        ),
                        child: Padding(
                          padding: const EdgeInsets.all(8),
                          child: Text(
                            'Base Flow Lab',
                            style: theme.textTheme.bodyLarge,
                          ),
                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(
                        top: 16,
                      ),
                      child: SizedBox(
                        width: 200.limW(
                          min: 200,
                          max: 250,
                        ),
                        child: ElevatedButton(
                          onPressed: () =&gt; Navigator.of(context).push(
                            MaterialPageRoute(
                              builder: (context) =&gt; const CustomFlowLabPage(),
                            ),
                          ),
                          child: Padding(
                            padding: const EdgeInsets.all(8),
                            child: Text(
                              'Custom Flow Lab',
                              style: theme.textTheme.bodyLarge,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


在Flutter中,布局管理是一个核心功能,而flexiflow并不是Flutter官方的一个标准布局插件。不过,基于你提到的flexiflow(假设它指的是某种自定义或第三方插件来实现类似Flexbox的布局),我们可以展示如何使用Flutter内置的Flexbox布局,因为Flutter的ColumnRow小部件已经提供了强大的Flexbox布局功能。

如果你是在寻找一个更复杂的布局解决方案,并且flexiflow是某个特定第三方库的名字,你可能需要查阅该库的文档来获取确切的使用方法。然而,在缺乏具体flexiflow库信息的情况下,我将展示如何使用Flutter内置的Flexbox布局特性。

使用Flutter内置的Flexbox布局特性

Flutter的ColumnRow小部件基于Flexbox布局模型,允许你使用mainAxisAlignment, crossAxisAlignment, flex等属性来控制子元素的布局。

示例代码:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flexbox Layout Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Flexible(
                flex: 2,
                child: Container(
                  color: Colors.red,
                  child: Center(child: Text('Flexible with flex: 2')),
                ),
              ),
              Flexible(
                flex: 1,
                child: Container(
                  color: Colors.green,
                  child: Center(child: Text('Flexible with flex: 1')),
                ),
              ),
              Expanded(
                child: Container(
                  color: Colors.blue,
                  child: Center(child: Text('Expanded')),
                ),
              ),
              Spacer(), // Takes up remaining space
              Container(
                height: 50,
                color: Colors.yellow,
                child: Center(child: Text('Fixed Height')),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释:

  1. Column:这是一个垂直方向的Flex容器。
  2. mainAxisAlignmentcrossAxisAlignment:这些属性用于控制子元素在主轴和交叉轴上的对齐方式。
  3. Flexible:一个可以伸缩的子元素,flex属性决定了它在剩余空间中的分配比例。
  4. Expanded:类似于Flexible,但Expanded会尽可能占用所有剩余空间。
  5. Spacer:一个空白的空间填充器,用于占用剩余空间。
  6. 固定高度的Container:一个具有固定高度的容器,不会随剩余空间变化。

这个示例展示了如何在Flutter中使用内置的Flexbox布局特性来创建复杂的布局。如果你确实在寻找一个名为flexiflow的特定第三方库,请查阅该库的官方文档或GitHub仓库以获取详细的使用指南和代码示例。

回到顶部