Flutter条件渲染插件conditioned的使用
Flutter条件渲染插件conditioned的使用
标题
Flutter条件渲染插件conditioned
的使用
内容
package: conditioned
一个包含一组Widget的包,用于从你的布局代码中移除丑陋的if
、if else
和switch
语句,并保持代码更一致。
使用
Conditioned
Widget就像其他任何Widget一样,可以在你的Widget树中使用。Conditioned
将有一个子节点。这个子节点是什么取决于你。
你将提供情况,Conditioned
会决定调用哪个builder
方法。
注意: 你总是需要提供一个返回Widget的方法作为builder
。使用Builder而不是Widgets可以提高性能并允许我们使用null对象。
基础知识
当你想要根据条件添加特定的子节点时,可以通过使用Conditioned
Widget来避免if
、else if
和else
的混乱。Conditioned
将使用第一个Case
的expression
验证为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: () => Icon(Icons.ac_unit)),
Case(myNumber < 50, builder: () => Icon(Icons.home)),
Case(myNumber < 75, builder: () => Icon(Icons.wb_cloudy)),
],
defaultBuilder: () => Icon(Icons.wb_sunny),
),
);
}
简单布尔检查
对于简单的真/假检查,你可以使用Conditioned.boolean
构造函数。它不会减少你的代码行数,但它确实使代码与布局代码保持一致。
不使用Conditioned.boolean
我们不能直接在布局代码中使用if .. else
。我们需要将其传播到一个函数(不推荐)或一个新的Widget。
Widget build(BuildContext context) {
return Container(
child: myNumber > 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 > 50,
trueBuilder: () => Text(
'The condition is true!',
style: TextStyle(color: Colors.orange[200]),
),
falseBuilder: () => Text(
'The condition is false!',
style: TextStyle(color: Colors.orange[800]),
),
),
);
}
switch情况
如果你不想使用switch
而是想通过等价性检查,你可以使用Conditioned.equality<T>
静态方法。
假设我们需要根据以下信息构建屏幕:
enum State {empty, loading, full, error}
final state = State.idle;
不使用Conditioned.equality<T>
我们不能直接在布局代码中使用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<T>
通过使用Conditioned.equality<T>
,你不需要在switch
点处打断布局树或引入Builder
Widget。你可以在有意义的地方打断树,例如在switch
之后。
Widget build(BuildContext context) {
return Container(
child: Conditioned.equality<State>( state,
values: [
Value(State.loading, builder: () => Text('The device is loading')),
Value(State.full, builder: () => Text('The device is fully loaded')),
Value(State.error, builder: () => Text('An error occured')),
],
defaultBuilder: () => Text('The device is operating as expected')
),
);
}
示例代码
import 'package:conditioned/conditioned.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final _myNumberNotifier = ValueNotifier<double>(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: <Widget>[
ValueListenableBuilder<double>(
valueListenable: _myNumberNotifier,
builder: (context, myNumber, child) => Column(
children: <Widget>[
Conditioned(
cases: [
Case(myNumber < 22, builder: () => Icon(Icons.ac_unit)),
Case(myNumber < 50, builder: () => Icon(Icons.home)),
Case(myNumber < 75, builder: () => Icon(Icons.wb_cloudy)),
],
defaultBuilder: () => Icon(Icons.wb_sunny),
),
Conditioned.boolean(
myNumber > 50,
trueBuilder: () => Icon(Icons.airplanemode_active),
falseBuilder: () => Icon(Icons.directions_car),
),
Conditioned.equality<int>(
myNumber.round(),
values: [
Value(100, builder: () => Icon(Icons.wb_sunny)),
Value(0, builder: () => Icon(Icons.add_a_photo))
],
defaultBuilder: () => Icon(Icons.ac_unit),
),
Text(myNumber.toStringAsFixed(1)),
Slider(
value: myNumber,
min: 0,
max: 100,
onChanged: (value) => _myNumberNotifier.value = value,
),
],
),
),
],
),
),
);
}
}
更多关于Flutter条件渲染插件conditioned的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
的值来渲染不同的文本。
- 当
isLoggedIn
为true
时,显示“Welcome, user!”的文本。 - 当
isLoggedIn
为false
时,显示“Please log in.”的文本。
ConditionedWidget
的使用非常直接,你只需要传入一个布尔条件以及两个回调函数:一个用于条件为真时渲染的Widget,另一个用于条件为假时渲染的Widget。
请注意,虽然conditioned
插件提供了便利的条件渲染功能,但Flutter本身已经提供了足够的灵活性来通过if-else
语句或?:
运算符来实现类似的功能。因此,如果你发现conditioned
插件不再维护或不适合你的需求,你也可以直接使用Flutter的内置功能来实现条件渲染。