Flutter权限请求与反馈插件bouncer的使用

Flutter权限请求与反馈插件bouncer的使用

问题陈述

当用户操作导致对某些慢速资源发起多个并发请求时,可能会出现两个问题:

  1. 资源耗尽
  2. 响应以随机顺序到达

该库旨在解决这两个问题。

示例动画

请参阅示例以供参考。

使用方法

代替以下代码:

var response = await _longRunningRequest(parameters);
_responseHandler(response);

我们可以进行防抖处理:

_debounceSubscription = TimerBouncer(Duration(milliseconds: 200)).debounce(
  request: () => _longRunningRequest(parameters),
  responseHandler: _responseHandler,
  oldSubscription: _debounceSubscription,
);

不要忘记在不再使用时取消 _debounceSubscription

[@override](/user/override)
dispose() {
  _debounceSubscription?.cancel();
  super.dispose();
}

完整示例Demo

以下是一个完整的Flutter应用程序示例,展示了如何使用 bouncer 插件:

import 'dart:math';

import 'package:bouncer/bouncer.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      title: 'Bouncer 示例',
      home: MyHomePage(),
    ),
  );
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _result = '尚无结果';
  bool _bouncerIsOn = false;
  Subscription? _debounceSubscription;

  // 根据上下文获取配置好的bouncer
  // 默认情况下不使用bouncer,适用于测试等场景
  Bouncer _bouncer(BuildContext context) {
    if (_bouncerIsOn) {
      return TimerBouncer(Duration(milliseconds: 200));
    } else {
      return NoBouncer();
    }
  }

  void _searchTextChanged(BuildContext context, String search) {
    // NoBouncer 实际上与直接调用以下代码相同
    // _responseHandler(await _longRunningRequest(search))
    _debounceSubscription = _bouncer(context).debounce(
      request: () => _longRunningRequest(search),
      responseHandler: _responseHandler,
      oldSubscription: _debounceSubscription!,
    );
  }

  // 模拟请求执行时间取决于搜索字符串的长度
  Future<String> _longRunningRequest(String search) {
    var rand = Random();
    return Future.delayed(
      Duration(seconds: rand.nextInt(2)),
      () => search.toUpperCase(),
    );
  }

  void _responseHandler(String result) {
    setState(() {
      _result = result;
    });
  }

  void _toggleBouncer(bool value) {
    setState(() {
      _bouncerIsOn = value;
    });
  }

  /// 取消订阅,避免调用setState
  [@override](/user/override)
  dispose() {
    _debounceSubscription?.cancel();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bouncer 示例'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          ListTile(
            title: Text('启用防抖'),
            leading: Switch(
              value: _bouncerIsOn,
              onChanged: _toggleBouncer,
            ),
          ),
          TextField(
            decoration: InputDecoration(
              hintText: '输入搜索词',
              contentPadding: EdgeInsets.symmetric(horizontal: 16),
            ),
            onChanged: (value) => _searchTextChanged(context, value),
          ),
          ListTile(title: Text('结果: $_result'))
        ],
      ),
    );
  }
}

更多关于Flutter权限请求与反馈插件bouncer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter权限请求与反馈插件bouncer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,bouncer 是一个流行的权限请求与反馈插件,它简化了权限请求的处理,并提供了一种统一的方式来处理用户的权限请求响应。以下是如何在Flutter项目中使用 bouncer 插件的一个简单示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 bouncer 依赖:

dependencies:
  flutter:
    sdk: flutter
  bouncer: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 项目中,你可以按照以下步骤使用 bouncer 插件:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:bouncer/bouncer.dart';
  1. 配置 Bouncer

在你的应用的主入口文件(通常是 main.dart)中,配置 Bouncer

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Bouncer(
        child: MyHomePage(),
        onRequestPermissionsResult: (bool granted, List<String> permissions) {
          // 处理权限请求结果
          if (granted) {
            print("Permissions granted: $permissions");
          } else {
            print("Permissions denied: $permissions");
          }
        },
      ),
    );
  }
}
  1. 请求权限

在你需要请求权限的地方(比如一个按钮点击事件),使用 Bouncerrequest 方法:

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bouncer Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 请求相机和存储权限
            final result = await Bouncer().request([
              Permission.camera,
              Permission.storage,
            ]);

            if (result.isGranted) {
              print("Permissions granted");
            } else if (result.isDeniedForever) {
              print("Permissions permanently denied");
              // 可以引导用户去设置中手动开启权限
            } else {
              print("Permissions denied");
            }
          },
          child: Text('Request Permissions'),
        ),
      ),
    );
  }
}
  1. 处理权限请求结果

在上面的代码中,我们已经在 BounceronRequestPermissionsResult 回调中处理了权限请求的结果。你也可以在按钮点击事件的回调中直接处理结果,如上面的例子所示。

这个示例展示了如何使用 bouncer 插件来请求权限并处理用户的响应。你可以根据项目的需求,进一步定制和扩展这个基础示例。

回到顶部