Flutter界面元素隐藏插件uiblock的使用

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

Flutter界面元素隐藏插件uiblock的使用

插件介绍

uiblock 是一个用于Flutter应用程序中简单而有效的方法,以阻止或取消阻止用户界面(UI)的操作。它能够通过一行代码实现UI的阻塞与解封,从而在加载或处理期间阻止用户导航。此插件具有以下特点:

  • 完全可定制
  • 支持Android和iOS平台
  • 使用简单方便
  • 无其他依赖项
  • 文档完善
  • 已准备好投入生产环境

example5 example1 example2 example3 example4

安装

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

1 回复

更多关于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使用了OpacityVisibility widget来实现隐藏和显示功能。你可以将这个自定义widget替换到之前的示例代码中。

回到顶部