Flutter界面元素隐藏插件uiblock的使用
Flutter界面元素隐藏插件uiblock的使用
插件介绍
uiblock 是一个用于Flutter应用程序中简单而有效的方法,以阻止或取消阻止用户界面(UI)的操作。它能够通过一行代码实现UI的阻塞与解封,从而在加载或处理期间阻止用户导航。此插件具有以下特点:
- 完全可定制
- 支持Android和iOS平台
- 使用简单方便
- 无其他依赖项
- 文档完善
- 已准备好投入生产环境
安装
Null-Safety 版本
dependencies:
uiblock: ^2.0.1
非Null-Safety 版本
dependencies:
uiblock: 1.2.0
快速开始
首先,在项目中添加uiblock依赖,并导入包:
import 'package:uiblock/uiblock.dart';
接下来,您可以按照以下方式使用uiblock
来阻塞和解除阻塞UI:
阻塞UI
// 默认用法
UIBlock.block(context);
// 或者使用globalKey
UIBlock.block(_scaffoldGlobalKey.currentContext);
解除阻塞UI
// 解除阻塞后调用unblock以关闭遮罩层
UIBlock.unblock(context);
// 或者使用globalKey
UIBlock.unblock(_scaffoldGlobalKey.currentContext);
作为Widget使用
您还可以将uiblock作为一个widget来使用,以便更灵活地控制UI的状态。例如:
FlatButton(
child: Text('Load Async'),
onPressed: () {
setState(() {
showLoader = !showLoader;
});
},
),
Container(
height: _height,
child: UIBlock(
loadingStateFromFuture: () async {
if (showLoader) {
// 返回null以阻塞UI
return null;
}
// 当有数据时解除阻塞
return Future.value(Random().nextInt(200));
},
barrierColor: Colors.blueGrey,
barrierOpacity: 0.2,
loadingTextWidget: Text('Loading data...'),
hideBuilderOnNullData: true,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
return Center(child: Text('Async Data ${snapshot.data}'));
},
),
);
自定义阻塞模式
您可以根据需要自定义阻塞模式,如显示文本、创建子构建器或设置模态转换等。
使用文本进行阻塞
UIBlock.block(
_scaffoldGlobalKey.currentContext,
canDissmissOnBack: true,
loadingTextWidget: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'Press back to dissmiss',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
fontWeight: FontWeight.w600,
),
),
),
);
使用子构建器创建
UIBlock.block(
_scaffoldGlobalKey.currentContext,
backgroundColor: Colors.green.withOpacity(0.5),
imageFilter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0),
childBuilder: (BuildContext context) {
// 返回您自己的小部件
},
);
创建自定义模态转换(仅适用于静态UIBlock.block)
UIBlock.block(
customBuildBlockModalTransitions:
(context, animation, secondaryAnimation, child) {
return RotationTransition(
turns: animation,
child: child,
);
},
);
带有数据返回的用法
如果您希望在解除阻塞时返回某些数据,可以这样做:
var result = await UIBlock.blockWithData(
_scaffoldGlobalKey.currentContext,
loadingTextWidget: Padding(
padding: const EdgeInsets.all(8.0),
child: FlatButton(
onPressed: () {
UIBlock.unblockWithData(context, "hello world");
},
child: Text(
'Press here to dissmiss with data. Back for null',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 18.0,
fontWeight: FontWeight.w600,
),
),
),
),
);
print(result);
更多详细信息请参阅官方示例。
属性列表
Property | Type | Default | Note |
---|---|---|---|
context (required) | BuildContext | - | - |
childBuilder | Function | - | - |
customLoaderChild | Widget | - | - |
loadingTextWidget | Widget | - | - |
imageFilter | ImageFilter | - | - |
backgroundColor | Color | Transparent | - |
canDissmissOnBack | bool | false | - |
safeAreaLeft | bool | true | 设置为’false’以禁用左侧安全区域 |
safeAreaTop | bool | true | 设置为’false’以禁用顶部(通常是状态栏)安全区域 |
safeAreaRight | bool | true | 设置为’false’以禁用右侧安全区域 |
safeAreaBottom | bool | true | 设置为’false’以禁用底部安全区域 |
safeAreaMinimumPadding | EdgeInsets | EdgeInsets.zero | - |
safeAreaMaintainBottomViewPadding | bool | false | - |
isSlideTransitionDefault | bool | true | 切换滑动或淡入淡出过渡 |
buildBlockModalTransitions | Function | - | 使用此属性创建自定义过渡,而非淡入淡出/滑动 |
小部件属性
Property | Type | Default |
---|---|---|
builder | Function | 您需实现 |
loadingStateFromFuture | Future | 您的未来函数(API等) |
loaderBuilder | Function | - |
customLoaderChild | Widget | - |
loadingTextWidget | Widget | - |
offset | Offset | - |
barrierOpacity | double | 0.4 |
barrierColor | Color | black45 |
canDismiss | bool | false |
hideBuilderOnNullData | bool | false |
提升与反馈
如果您发现了任何问题或有新的想法,欢迎提交issue或者PR到GitHub仓库。此外,请不要忘记给这个优秀的插件点个赞哦!
以上就是关于uiblock
插件的基本介绍及使用方法,希望对您有所帮助!如果还有其他疑问,欢迎随时提问。
更多关于Flutter界面元素隐藏插件uiblock的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter界面元素隐藏插件uiblock的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用uiblock
插件来隐藏界面元素的示例代码。uiblock
是一个假设的插件名称,实际中可能没有这样一个现成的插件,但原理是类似的。假设我们有一个自定义的插件来实现这一功能。
首先,你需要在pubspec.yaml
文件中添加这个假设的uiblock
插件依赖(注意:这只是一个示例,实际中你需要查找并使用一个真实的插件或者自己实现):
dependencies:
flutter:
sdk: flutter
uiblock: ^0.0.1 # 假设版本号
然后运行flutter pub get
来获取依赖。
接下来,我们编写一个示例代码来展示如何使用这个插件。假设uiblock
插件提供了一个UiBlock
widget,可以用来包裹需要隐藏的元素,并通过一个布尔值来控制显示和隐藏。
import 'package:flutter/material.dart';
import 'package:uiblock/uiblock.dart'; // 假设这是插件的导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter UiBlock Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool isBlocked = false;
void toggleBlock() {
setState(() {
isBlocked = !isBlocked;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter UiBlock Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
UiBlock(
block: isBlocked,
child: Text(
'This text will be hidden when UiBlock is active',
style: TextStyle(fontSize: 24),
),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: toggleBlock,
child: Text('Toggle UiBlock'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个UiBlock
widget,它包裹了一个Text
widget。UiBlock
widget有一个block
属性,当这个属性为true
时,它会隐藏其子widget。我们通过点击按钮来切换isBlocked
变量的值,从而控制UiBlock
的行为。
请注意,由于uiblock
是一个假设的插件名称,实际中你需要使用一个真实的插件或者自己实现类似的功能。如果你找不到现成的插件,你可以通过自定义一个widget来实现界面元素的隐藏和显示,例如:
class UiBlock extends StatelessWidget {
final bool block;
final Widget child;
UiBlock({required this.block, required this.child});
@override
Widget build(BuildContext context) {
return Opacity(
opacity: block ? 0.0 : 1.0,
child: Visibility(
visible: !block,
child: child,
),
);
}
}
这个自定义的UiBlock
widget使用了Opacity
和Visibility
widget来实现隐藏和显示功能。你可以将这个自定义widget替换到之前的示例代码中。