Flutter响应式布局插件go_responsive_annotation的使用

Flutter响应式布局插件go_responsive_annotation的使用

GoResponsive MIT

一个受responsive_framework连续逻辑和基于上下文的响应式数据以及responsive_builder响应式小部件启发的简单但表达性强的响应式框架。生成所有定义的断点作为可选参数,以及必需的默认小部件参数。

Preview

特性

GoResponsive通过以下方式使响应式设计变得简单:

  • 生成带有所有定义的断点的GoResponsiveWidget,并带有一个必需的默认小部件参数。
  • 在BuildContext上生成context.goResponsiveValue<T>扩展方法,以便可以设置类型化的值。
  • 在BuildContext上生成context.is{breakpoint_name}扩展方法,以便可以在条件中使用。
  • 生成GoResponsiveBreakpoints.{breakpoint_name}字符串字段用于断点名称。

开始使用

依赖项

dependencies:
  ...
  go_responsive: <version>
  go_responsive_annotation: <version>

dev_dependencies:
  ...
  build_runner: <version>
  go_responsive_generator: <version>

使用示例

1. 定义go_responsive.dart

import 'package:flutter/widgets.dart';
import 'package:go_responsive/go_responsive.dart';
import 'package:go_responsive_annotation/go_responsive_annotation.dart';

part 'go_responsive.g.dart';

@goResponsive
const breakpoints = [
  GoResponsiveBreakpoint(size: 600, name: 'compact'),
  GoResponsiveBreakpoint(size: 840, name: 'medium'),
  GoResponsiveBreakpoint(size: double.maxFinite, name: 'expanded'),
];

2. 在MaterialApp的构建器函数中返回GoResponsiveBuilder,并将断点设置为已定义的breakpoints列表。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const Home(),
      builder: (context, child) {
        return GoResponsiveBuilder(
          breakpoints: breakpoints,
          child: child,
        );
      },
    );
  }
}

3. 运行dart run build_runner build在控制台中生成go_responsive.g.dart

4. 导入go_responsive.dart,然后可以使用context.goResponsiveValue

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: context.goResponsiveValue(
          compact: Colors.red,
          medium: Colors.green,
          expanded: Colors.blue,
          defaultValue: Colors.black,
        ),
      ),
    );
  }
}

5. 使用或GoResponsiveWidget

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: GoResponsiveWidget(
        compact: Container(color: Colors.red),
        medium: Container(color: Colors.green),
        expanded: Container(color: Colors.blue),
        defaultWidget: Container(color: Colors.black),
      ),
    );
  }
}

6. 或者使用context.is{breakpoint_name}与if else

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    var color = Colors.black;

    if (context.isCompact) {
      color = Colors.red;
    }

    if (context.isMedium) {
      color = Colors.green;
    }

    if (context.isExpanded) {
      color = Colors.blue;
    }

    return Scaffold(
      body: Container(color: color),
    );
  }
}

7. 或者使用context.goResponsiveDataGoResponsiveBreakpoints.{breakpoint_name}组合以实现自定义条件

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    var color = Colors.black;

    if (context.goResponsiveData.smallerOrEqualTo(GoResponsiveBreakpoints.compact)) {
      color = Colors.red;
    }

    if (context.goResponsiveData.between(
      GoResponsiveBreakpoints.compact,
      GoResponsiveBreakpoints.expanded,
    )) {
      color = Colors.green;
    }

    if (context.goResponsiveData.between(
      GoResponsiveBreakpoints.medium,
      GoResponsiveBreakpoints.expanded,
    )) {
      color = Colors.blue;
    }

    return Scaffold(
      body: Container(color: color),
    );
  }
}

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

1 回复

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


go_responsive_annotation 是一个用于 Flutter 的响应式布局插件,它通过注解的方式帮助开发者更方便地实现响应式布局。该插件允许你通过定义不同的屏幕尺寸和布局规则,自动调整 UI 在不同设备上的显示效果。

以下是如何使用 go_responsive_annotation 插件的详细步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 go_responsive_annotationgo_router 依赖:

dependencies:
  flutter:
    sdk: flutter
  go_responsive_annotation: ^1.0.0
  go_router: ^5.0.0

dev_dependencies:
  build_runner: ^2.1.0
  go_responsive_builder: ^1.0.0

2. 创建响应式布局类

接下来,创建一个类并使用 @Responsive 注解来定义不同屏幕尺寸下的布局规则。

import 'package:go_responsive_annotation/go_responsive_annotation.dart';

part 'responsive_layout.g.dart';

@Responsive()
class ResponsiveLayout {
  @ResponsiveProperty()
  double get padding => _padding;
  double _padding;

  @ResponsiveProperty()
  double get fontSize => _fontSize;
  double _fontSize;

  ResponsiveLayout({
    required double padding,
    required double fontSize,
  })  : _padding = padding,
        _fontSize = fontSize;

  factory ResponsiveLayout.small() => ResponsiveLayout(
        padding: 8.0,
        fontSize: 14.0,
      );

  factory ResponsiveLayout.medium() => ResponsiveLayout(
        padding: 16.0,
        fontSize: 16.0,
      );

  factory ResponsiveLayout.large() => ResponsiveLayout(
        padding: 24.0,
        fontSize: 18.0,
      );
}

3. 生成代码

运行以下命令生成响应式布局类的代码:

flutter pub run build_runner build

这将生成 responsive_layout.g.dart 文件,其中包含了根据屏幕尺寸自动选择的布局规则。

4. 在应用中使用响应式布局

在 Flutter 应用中使用生成的响应式布局类:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Responsive Layout Example'),
        ),
        body: ResponsiveLayoutBuilder(
          small: ResponsiveLayout.small(),
          medium: ResponsiveLayout.medium(),
          large: ResponsiveLayout.large(),
          builder: (context, layout) {
            return Padding(
              padding: EdgeInsets.all(layout.padding),
              child: Text(
                'Hello, World!',
                style: TextStyle(fontSize: layout.fontSize),
              ),
            );
          },
        ),
      ),
    );
  }
}

5. 自定义屏幕尺寸

你可以在 ResponsiveLayoutBuilder 中自定义屏幕尺寸的断点:

ResponsiveLayoutBuilder(
  small: ResponsiveLayout.small(),
  medium: ResponsiveLayout.medium(),
  large: ResponsiveLayout.large(),
  breakpoints: ResponsiveBreakpoints(
    small: 600,
    medium: 900,
    large: 1200,
  ),
  builder: (context, layout) {
    return Padding(
      padding: EdgeInsets.all(layout.padding),
      child: Text(
        'Hello, World!',
        style: TextStyle(fontSize: layout.fontSize),
      ),
    );
  },
)
回到顶部