Flutter权限请求与反馈插件bouncer的使用
Flutter权限请求与反馈插件bouncer的使用
问题陈述
当用户操作导致对某些慢速资源发起多个并发请求时,可能会出现两个问题:
- 资源耗尽
- 响应以随机顺序到达
该库旨在解决这两个问题。
请参阅示例以供参考。
使用方法
代替以下代码:
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
更多关于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
插件:
- 导入必要的包:
import 'package:flutter/material.dart';
import 'package:bouncer/bouncer.dart';
- 配置 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");
}
},
),
);
}
}
- 请求权限:
在你需要请求权限的地方(比如一个按钮点击事件),使用 Bouncer
的 request
方法:
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'),
),
),
);
}
}
- 处理权限请求结果:
在上面的代码中,我们已经在 Bouncer
的 onRequestPermissionsResult
回调中处理了权限请求的结果。你也可以在按钮点击事件的回调中直接处理结果,如上面的例子所示。
这个示例展示了如何使用 bouncer
插件来请求权限并处理用户的响应。你可以根据项目的需求,进一步定制和扩展这个基础示例。