Flutter界面阻塞插件block_ui的使用
Flutter界面阻塞插件block_ui的使用
Block UI 是一个出色的包,可以帮助你在所有的异步操作期间添加覆盖加载器。
使用方法
1. 简单的覆盖
ElevatedButton(
onPressed:(){
BlockUi.show(context);
// 异步操作(例如 Future.delayed(Duration(milliseconds: 1000)))
BlockUi.hide(context);
}
)
2. 自定义覆盖
ElevatedButton(
onPressed:(){
BlockUi.show(
context,
backgroundColor: Colors.black, // 更改背景颜色
child: Text("请稍等..."), // 更改中心的 widget
);
// 异步操作(例如 Future.delayed(Duration(milliseconds: 1000)))
BlockUi.hide(context);
}
)
你可以查看示例部分,以获取更多关于 block_ui
的示例。
属性
以下是你可以用来自定义 block_ui
的不同属性:
属性 | 描述 |
---|---|
context | BuildContext context |
child | 添加不同的中心 widget。你也可以添加自定义的加载器、文本或图片等。 |
backgroundColor | 更改背景颜色 |
backgroundWidget | 更改背景 widget |
示例代码
以下是一个完整的示例代码,展示了如何在 Flutter 应用程序中使用 block_ui
包。
import 'package:block_ui/block_ui.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'block ui demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("block ui demo"),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: Text("试试看!"),
),
FilledButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
onPressed: () async {
BlockUi.show(context);
await Future.delayed(Duration(milliseconds: 1000));
BlockUi.hide(context);
},
child: Text("打开默认加载器"),
),
const SizedBox(
height: 5,
),
FilledButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
onPressed: () async {
BlockUi.show(context,
backgroundColor: Colors.green,
child: SpinKitChasingDots(color: Color(0xff388e3c)));
await Future.delayed(Duration(milliseconds: 1000));
BlockUi.hide(context);
},
child: Text("自定义加载器"),
),
const SizedBox(
height: 5,
),
FilledButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
onPressed: () async {
BlockUi.show(context,
backgroundColor: Colors.blue,
child: Text(
"请稍等...",
style: TextStyle(
color: Colors.blue[800],
fontSize: 35,
fontWeight: FontWeight.bold,
),
));
await Future.delayed(Duration(milliseconds: 1000));
BlockUi.hide(context);
},
child: Text("带文本的自定义加载器"),
),
const SizedBox(
height: 5,
),
FilledButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
),
),
onPressed: () async {
BlockUi.show(context,
backgroundWidget: Image.network(
"https://images.unsplash.com/photo-1492321936769-b49830bc1d1e?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=334&q=80",
fit: BoxFit.cover,
height: double.infinity,
width: double.infinity,
),
child: SpinKitPouringHourglass(color: Colors.white));
await Future.delayed(Duration(milliseconds: 2000));
BlockUi.hide(context);
},
child: Text("带图片的自定义加载器"),
),
],
),
),
);
}
}
更多关于Flutter界面阻塞插件block_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter界面阻塞插件block_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用block_ui
插件来阻塞界面的一个简单示例。block_ui
插件允许你在Flutter应用中显示一个覆盖层来阻塞用户交互,直到某个异步操作完成。
首先,确保你的pubspec.yaml
文件中已经添加了block_ui
依赖:
dependencies:
flutter:
sdk: flutter
block_ui: ^3.0.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以使用以下代码来展示如何使用block_ui
:
import 'package:flutter/material.dart';
import 'package:block_ui/block_ui.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Block UI Example'),
),
body: Center(
child: BlockUIExample(),
),
),
);
}
}
class BlockUIExample extends StatefulWidget {
@override
_BlockUIExampleState createState() => _BlockUIExampleState();
}
class _BlockUIExampleState extends State<BlockUIExample> with BlockUIStates {
// 初始化BlockUI
@override
void initState() {
super.initState();
blockUI = BlockUI(
// 自定义覆盖层样式
blockingWidget: Container(
color: Colors.black.withOpacity(0.5),
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
),
),
),
)..init(context);
}
void _performAsyncOperation() async {
// 阻塞界面
blockUI.block();
// 模拟异步操作,例如网络请求
await Future.delayed(Duration(seconds: 3));
// 异步操作完成后解除阻塞
blockUI.unblock();
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _performAsyncOperation,
child: Text('Block UI'),
);
}
}
在这个示例中,我们做了以下事情:
- 引入依赖:在
pubspec.yaml
文件中添加了block_ui
依赖。 - 创建UI:创建了一个简单的Flutter应用,其中包含一个按钮。
- 初始化BlockUI:在
_BlockUIExampleState
类的initState
方法中初始化了BlockUI
,并设置了覆盖层的样式。 - 阻塞与解除阻塞:在按钮点击事件中,首先调用
blockUI.block()
来阻塞界面,然后模拟一个异步操作(例如网络请求),使用Future.delayed
模拟延迟。最后,调用blockUI.unblock()
来解除阻塞。
这样,当用户点击按钮时,界面将被一个带有进度指示器的覆盖层阻塞,直到异步操作完成。