Flutter界面阻塞插件block_ui的使用

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

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'),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. 引入依赖:在pubspec.yaml文件中添加了block_ui依赖。
  2. 创建UI:创建了一个简单的Flutter应用,其中包含一个按钮。
  3. 初始化BlockUI:在_BlockUIExampleState类的initState方法中初始化了BlockUI,并设置了覆盖层的样式。
  4. 阻塞与解除阻塞:在按钮点击事件中,首先调用blockUI.block()来阻塞界面,然后模拟一个异步操作(例如网络请求),使用Future.delayed模拟延迟。最后,调用blockUI.unblock()来解除阻塞。

这样,当用户点击按钮时,界面将被一个带有进度指示器的覆盖层阻塞,直到异步操作完成。

回到顶部