Flutter条件渲染插件conditioned的使用

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

Flutter条件渲染插件conditioned的使用

标题

Flutter条件渲染插件conditioned的使用

内容

package: conditioned

一个包含一组Widget的包,用于从你的布局代码中移除丑陋的ifif elseswitch语句,并保持代码更一致。

使用

Conditioned Widget就像其他任何Widget一样,可以在你的Widget树中使用。Conditioned将有一个子节点。这个子节点是什么取决于你。 你将提供情况,Conditioned会决定调用哪个builder方法。

注意: 你总是需要提供一个返回Widget的方法作为builder。使用Builder而不是Widgets可以提高性能并允许我们使用null对象。

基础知识

当你想要根据条件添加特定的子节点时,可以通过使用Conditioned Widget来避免ifelse ifelse的混乱。Conditioned将使用第一个Caseexpression验证为true时的builder方法。

不使用Conditioned

我们不能直接在布局代码中使用if .. else if .. else。我们需要将其传播到一个函数(不推荐)或一个新的Widget。

Widget build(BuildContext context) {
  return Container(
    child: _getIcon(),
  );
}

Widget _getIcon() {
  if (myNumber < 25)
    return Icon(Icons.ac_unit);
  else if (myNumber < 50)
    return Icon(Icons.home);
  else if (myNumber < 75)
    return Icon(Icons.wb_cloudy);
  else
    return Icon(Icons.wb_sunny);
}

使用Conditioned

通过使用Conditioned,你不需要在if .. else if .. else点处打断布局树。你可以在有意义的地方打断树,通常是条件之后。

Widget build(BuildContext context) {
  return Container(
    child: Conditioned(
      cases: [
        Case(myNumber < 25, builder: () =&gt; Icon(Icons.ac_unit)),
        Case(myNumber < 50, builder: () =&gt; Icon(Icons.home)),
        Case(myNumber < 75, builder: () =&gt; Icon(Icons.wb_cloudy)),
      ],
      defaultBuilder: () =&gt; Icon(Icons.wb_sunny),
    ),
  );
}

简单布尔检查

对于简单的真/假检查,你可以使用Conditioned.boolean构造函数。它不会减少你的代码行数,但它确实使代码与布局代码保持一致。

不使用Conditioned.boolean

我们不能直接在布局代码中使用if .. else。我们需要将其传播到一个函数(不推荐)或一个新的Widget。

Widget build(BuildContext context) {
    return Container(
        child: myNumber &gt; 50
          ? Text(
              'The condition is true!',
              style: TextStyle(color: Colors.green[200]),
            )
          : Text(
              'The condition is false!',
              style: TextStyle(color: Colors.green[800]),
        ),
    );
}

使用Conditioned.boolean

通过使用Conditioned.boolean,你不需要在布尔条件点处打断布局树。你可以在有意义的地方打断树,通常是条件之后。

Widget build(BuildContext context) {
    return Container(
        child: Conditioned.boolean( myNumber &gt; 50,
            trueBuilder: () =&gt; Text(
              'The condition is true!',
              style: TextStyle(color: Colors.orange[200]),
            ),
            falseBuilder: () =&gt; Text(
              'The condition is false!',
              style: TextStyle(color: Colors.orange[800]),
            ),
        ),
    );
}

switch情况

如果你不想使用switch而是想通过等价性检查,你可以使用Conditioned.equality&lt;T&gt;静态方法。

假设我们需要根据以下信息构建屏幕:

enum State {empty, loading, full, error}
final state = State.idle;

不使用Conditioned.equality&lt;T&gt;

我们不能直接在布局代码中使用switch。我们需要将其传播到一个函数(不推荐)或一个新的Widget。

Widget build(BuildContext context) {
  return Container(
    child: _getStateText(),
  );
}

Widget _getStateText() {
  switch(state) {
    case State.loading:
      return Text('The device is loading');
    case State.full:
      return Text('The device is fully loaded');
    case State.error:
      return Text('An error occured');
    default:
      return Text('The device is operating as expected');
  }
}

使用Conditioned.equality&lt;T&gt;

通过使用Conditioned.equality&lt;T&gt;,你不需要在switch点处打断布局树或引入Builder Widget。你可以在有意义的地方打断树,例如在switch之后。

Widget build(BuildContext context) {
  return Container(
    child: Conditioned.equality&lt;State&gt;( state,
      values: [
        Value(State.loading, builder: () =&gt; Text('The device is loading')),
        Value(State.full, builder: () =&gt; Text('The device is fully loaded')),
        Value(State.error, builder: () =&gt; Text('An error occured')),
      ],
      defaultBuilder: () =&gt; Text('The device is operating as expected')
    ),
  );
}

示例代码

import 'package:conditioned/conditioned.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  final _myNumberNotifier = ValueNotifier&lt;double&gt;(0.0);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Conditioned Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Conditioned Demo'),
        ),
        body: Column(
          children: &lt;Widget&gt;[
            ValueListenableBuilder&lt;double&gt;(
              valueListenable: _myNumberNotifier,
              builder: (context, myNumber, child) =&gt; Column(
                children: &lt;Widget&gt;[
                  Conditioned(
                    cases: [
                      Case(myNumber &lt; 22, builder: () =&gt; Icon(Icons.ac_unit)),
                      Case(myNumber &lt;  50, builder: () =&gt; Icon(Icons.home)),
                      Case(myNumber &lt;  75, builder: () =&gt; Icon(Icons.wb_cloudy)),
                    ],
                    defaultBuilder: () =&gt; Icon(Icons.wb_sunny),
                  ),
                  Conditioned.boolean(
                    myNumber &gt; 50,
                    trueBuilder: () =&gt; Icon(Icons.airplanemode_active),
                    falseBuilder: () =&gt; Icon(Icons.directions_car),
                  ),
                  Conditioned.equality&lt;int&gt;(
                    myNumber.round(),
                    values: [
                      Value(100, builder: () =&gt; Icon(Icons.wb_sunny)),
                      Value(0, builder: () =&gt; Icon(Icons.add_a_photo))
                    ],
                    defaultBuilder: () =&gt; Icon(Icons.ac_unit),
                  ),
                  Text(myNumber.toStringAsFixed(1)),
                  Slider(
                    value: myNumber,
                    min: 0,
                    max: 100,
                    onChanged: (value) =&gt; _myNumberNotifier.value = value,
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用conditioned插件来实现条件渲染的一个简单示例。conditioned插件允许你根据条件动态地渲染不同的Widget。

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

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

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

接下来是一个完整的示例代码,展示如何使用conditioned插件:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isLoggedIn = false;

  void toggleLoginStatus() {
    setState(() {
      isLoggedIn = !isLoggedIn;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Conditioned Rendering Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You are ${isLoggedIn ? "logged in" : "not logged in"}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: toggleLoginStatus,
              child: Text('Toggle Login Status'),
            ),
            SizedBox(height: 20),
            ConditionedWidget(
              condition: isLoggedIn,
              whenTrue: () => Text(
                'Welcome, user!',
                style: TextStyle(color: Colors.green),
              ),
              whenFalse: () => Text(
                'Please log in.',
                style: TextStyle(color: Colors.red),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮用于切换登录状态。ConditionedWidget根据isLoggedIn的值来渲染不同的文本。

  • isLoggedIntrue时,显示“Welcome, user!”的文本。
  • isLoggedInfalse时,显示“Please log in.”的文本。

ConditionedWidget的使用非常直接,你只需要传入一个布尔条件以及两个回调函数:一个用于条件为真时渲染的Widget,另一个用于条件为假时渲染的Widget。

请注意,虽然conditioned插件提供了便利的条件渲染功能,但Flutter本身已经提供了足够的灵活性来通过if-else语句或?:运算符来实现类似的功能。因此,如果你发现conditioned插件不再维护或不适合你的需求,你也可以直接使用Flutter的内置功能来实现条件渲染。

回到顶部