Flutter条件渲染插件flutter_conditional的使用

Flutter条件渲染插件flutter_conditional的使用

Conditional渲染变得简单!💎

pub package License

由 💙 开发并维护 scial.app

Buy Me A Coffee

迁移 🆙

Migrating to 2.0.0

Before

class SomeWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final bool someCondition = false;

    return Conditional.single(
      someCondition,
      builder: (BuildContext _) => WidgetA(),
      fallbackBuilder: (BuildContext _) => WidgetB()
    );
  }
}

After

class SomeWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final bool someCondition = false;

    return Conditional.single(
      condition: someCondition,
      widget: WidgetA(),
      fallback: WidgetB()
    );
  }
}

或者使用版本 2.1.0 引入的方法:

  • .singleBuilder(...)
  • .multiCaseBuilder(...)
  • .multiMatchBuilder<T>(...)
  • .optionalSingleBuilder(...)
  • .optionalMultiCaseBuilder(...)
  • .optionalMultiMatchBuilder<T>(...)

快速开始 🚀

安装 🧑‍💻

pubspec.yamldependencies 部分添加以下行:

dependencies:
  flutter_conditional: <latest_version>

使用 👽

导入包:

import 'package:flutter_conditional/flutter_conditional.dart';

单一条件

这个构造函数非常简单。你可以传递一个简单的布尔表达式。

class TrueOrFalseWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final bool ideaForName = false;

    return Conditional.single(
      condition: ideaForName,
      widget: TrueWidget(),
      fallback: FalseWidget()
    );
  }
}

多个情况

这个构造函数允许你传递多个情况,每个情况包含一个布尔表达式和一个部件构建器。

class MultiWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final int randomNumber = 69;
    final String randomOS = 'Linux';
    final bool isSchroedingersCatAlive = true; // 希望如此

    return Conditional.multiCase(
      cases: [
        Case(
          condition: randomNumber == 0,
          widget: NumberWidget()
        ),
        Case(
          condition: randomOS == 'Linux',
          widget: OSWidget() // <-- 这个会被返回
        ),
        Case(
          condition: isSchroedingersCatAlive,
          widget: SchroedingersWidget()
        )
      ],
      fallback: OtherWidget()
    );
  }
}

多种匹配

这个构造函数允许你比较对象。

class CarWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final String carCompany = 'Tesla';

    return Conditional.multiMatch<String>(
      value: carCompany,
      values: [
        Value(
          value: 'Tesla',
          widget: TeslaWidget() // <-- 这个会被返回
        ),
        Value(
          value: 'Mercedes',
          widget: MercedesWidget()
        ),
        Value(
          value: 'BMW',
          widget: BMWWidget()
        )
      ],
      fallback: OtherWidget()
    );
  }
}

或者

enum Seasons {
    summer,
    autumn,
    winter,
    spring
}

class SeasonWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final Seasons season = Seasons.winter;

    return Conditional.multiMatch<Seasons>(
      value: season,
      values: [
        Value(
          value: Seasons.summer,
          widget: SummerWidget()
        ),
        Value(
          value: Seasons.autumn,
          widget: AutumnWidget()
        ),
        Value(
          value: Seasons.winter,
          widget: WinterWidget() // <-- 这个会被返回
        ),
        Value(
          value: Seasons.spring,
          widget: SpringWidget()
        )
      ],
      fallback: OtherWidget()
    );
  }
}

其他功能 ⚜️

可选部件

在某些情况下,如果给定条件未满足,则你甚至不想渲染任何部件。 因此我们引入了可以返回 null 的附加函数:

  • .optionalSingle(...)
  • .optionalMultiCase(...)
  • .optionalMultiMatch<T>(...)

构建函数

在某些情况下,你可能想使用构建函数。 因此我们引入了接受构建函数的附加函数:

  • .singleBuilder(...)
  • .multiCaseBuilder(...)
  • .multiMatchBuilder<T>(...)
  • .optionalSingleBuilder(...)
  • .optionalMultiCaseBuilder(...)
  • .optionalMultiMatchBuilder<T>(...)

isActive

有时你甚至希望使情况成为条件。因此我们引入了 isActive 参数。如果你不希望一个或多个情况被考虑在内,请将 true 传递给它,如以下示例所示:

class ProfileWidget extends StatelessWidget {

  Widget build(BuildContext context) {

    final bool iLoveDart = true;
    final bool possiblyChanging = false;

    return Conditional.multiCase(
      cases: [
        Case(
          condition: iLoveDart,
          isActive: possiblyChanging,
          widget: FirstWidget()
        ),
        Case(
          condition: iLoveDart,
          widget: SecondWidget() // <-- 这个会被返回
        )
      ],
      fallback: OtherWidget()
    );
  }
}

规则 ✅

  • 仅标记为 isActive 的情况会被考虑。这默认为真。
  • 第一个条件为真的部件将被返回。
  • 如果你没有使用版本 2.0.0 引入的函数,默认的回退部件为 SizedBox.shrink()

贡献 💙

始终开放贡献!贡献者将在此列出。


示例代码

import 'package:flutter/material.dart';

import 'package:flutter_conditional/flutter_conditional.dart';

void main() {
  runApp(const App());
}

class App extends StatefulWidget {

  const App({super.key});

  [@override](/user/override)
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {

  bool firstExpression = true;
  bool secondExpression = true;
  String company = 'scial';

  [@override](/user/override)
  Widget build(BuildContext context) {

    final EdgeInsets padding = MediaQuery.of(context).padding;

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        floatingActionButton: FloatingActionButton(
          onPressed: _toggle,
          backgroundColor: Colors.blue,
          foregroundColor: Colors.white,
          child: const Icon(Icons.toggle_on)
        ),
        body: SingleChildScrollView(
          padding: EdgeInsets.only(
            left: padding.left + 16.0,
            top: padding.top + 16.0,
            right: padding.right + 16.0,
            bottom: padding.bottom + 16.0
          ),
          child: Column(
            children: [
              Conditional.single(
                condition: firstExpression,
                widget: const CustomCard(
                  color: Colors.blue, 
                  text: 'FIRST EXPRESSION'
                )
              ),
              Conditional.multiCase(
                cases: <Case>[
                  Case(
                    condition: secondExpression,
                    isActive: false,
                    widget: const CustomCard(
                      color: Colors.green, 
                      text: 'SECOND EXPRESSION 1'
                    )
                  ),
                  Case(
                    condition: secondExpression,
                    widget: const CustomCard(
                      color: Colors.orange, 
                      text: 'SECOND EXPRESSION 2'
                    )
                  )
                ],
                fallback: const CustomCard(
                  color: Colors.green, 
                  text: 'SECOND EXPRESSION FALLBACK'
                )
              ),
              Conditional.multiMatch<String>(
                value: company,
                values: <Value<String>>[
                  const Value<String>(
                    value: 'scial', 
                    widget: CustomCard(
                      color: Colors.pink, 
                      text: 'scial'
                    )
                  ),
                  const Value<String>(
                    value: 'Tesla', 
                    widget: CustomCard(
                      color: Colors.purple, 
                      text: 'Tesla'
                    )
                  )
                ]
              )
            ]
          )
        )
      )
    );
  }

  void _toggle() {
    setState(() {
      firstExpression = !firstExpression;
      secondExpression = !secondExpression;
      company = company == 'scial' ? 'Tesla' : 'scial';
    });
  }
}

class CustomCard extends StatelessWidget {

  final Color color;
  final String text;

  const CustomCard({
    super.key,
    required this.color,
    required this.text
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: 80.0,
      alignment: Alignment.center,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(12.0),
        color: color
      ),
      child: Text(
        text,
        maxLines: 1,
        overflow: TextOverflow.ellipsis,
        style: const TextStyle(
          fontWeight: FontWeight.bold,
          fontSize: 14.0,
          color: Colors.white
        ),
      )
    );
  }
}

更多关于Flutter条件渲染插件flutter_conditional的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_conditional插件进行条件渲染的一个示例。首先,你需要确保你的Flutter项目已经添加了这个插件。如果还没有添加,可以在pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_conditional: ^latest_version  # 请替换为最新的版本号

然后运行flutter pub get来安装插件。

flutter_conditional插件的主要功能是简化条件渲染逻辑。虽然Flutter本身已经提供了强大的条件渲染能力(通过if-else语句或?:运算符),但这个插件可能会使某些复杂的条件渲染逻辑更加清晰。

以下是一个简单的示例,展示如何使用flutter_conditional进行条件渲染:

  1. 导入插件

在你的Dart文件中导入flutter_conditional插件:

import 'package:flutter/material.dart';
import 'package:flutter_conditional/flutter_conditional.dart';
  1. 定义条件逻辑

假设我们有一个简单的条件逻辑,根据一个布尔值来决定显示哪个组件:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Conditional Rendering Example'),
        ),
        body: Center(
          child: ConditionalBuilder<bool>(
            condition: true,  // 这里可以替换为实际的条件逻辑
            builderWhenTrue: (context) => Text('Condition is true!'),
            builderWhenFalse: (context) => Text('Condition is false!'),
          ),
        ),
      ),
    );
  }
}

在这个例子中,我们使用了ConditionalBuilder,它接受一个布尔类型的condition参数,以及两个构建器函数:builderWhenTruebuilderWhenFalse。根据condition的值,它会调用相应的构建器函数来构建Widget。

然而,需要注意的是,flutter_conditional插件的具体API可能会根据版本有所不同。上述示例是基于假设的API设计。实际上,到目前为止(2023年),flutter_conditional插件在pub.dev上并不存在,或者它可能不是一个广泛使用的官方或社区插件。

如果你的目的是简化条件渲染,Flutter本身已经提供了足够的灵活性。例如,你可以使用if语句或者?:运算符直接在build方法中实现条件渲染:

class MyApp extends StatelessWidget {
  bool condition = true; // 假设这是你的条件

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Conditional Rendering Example'),
        ),
        body: Center(
          child: condition
              ? Text('Condition is true!')
              : Text('Condition is false!'),
        ),
      ),
    );
  }
}

这种方式不需要额外的插件,并且完全由Flutter框架本身支持。希望这能帮助你理解如何在Flutter中进行条件渲染。

回到顶部