Flutter 如何禁用按钮,直到http请求加载到Flatter中?
我正在尝试实现一个颤振应用程序,从API端点获取数据。我已经在按下按钮时实现了fetch函数 尽管如此,我希望在获取请求时禁用该按钮(以避免多次单击) 我使用darthttp包实现了它 以下是我的代码:Flutter 如何禁用按钮,直到http请求加载到Flatter中?,flutter,httprequest,Flutter,Httprequest,我正在尝试实现一个颤振应用程序,从API端点获取数据。我已经在按下按钮时实现了fetch函数 尽管如此,我希望在获取请求时禁用该按钮(以避免多次单击) 我使用darthttp包实现了它 以下是我的代码: import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_pr
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(Home());
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
String _advice = '';
int _counter = 0;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('App 1'),
centerTitle: true,
),
body: Center(
child: Container(
padding: EdgeInsets.all(32.0),
child: Column(
children: <Widget>[
// Text 1 - advice
Container(
padding: EdgeInsets.all(16.0),
child: Text(
'$_advice',
style: TextStyle(
fontSize: 20.0,
),
),
),
// Text 2 - counter
Text(
'$_counter',
style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold),
),
],
),
),
),
// Floating button
floatingActionButton: FloatingActionButton(
child: Icon(Icons.file_download),
onPressed: _fetchPost,
),
),
);
}
_fetchPost() async {
final url = 'https://api.adviceslip.com/advice';
final response = await http.get(url);
dynamic body = json.decode(response.body);
// If server returns an OK response, parse the JSON.
if (response.statusCode == 200) {
print(response.body);
setState(() {
_advice = body['slip']['advice'];
_counter += 1;
});
}
// If that response was not OK, throw an error.
else {
// throw Exception('Failed to load post');
print('Failed to load post');
}
}
}
导入'dart:convert';
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“package:shared_preferences/shared_preferences.dart”;
void main()=>runApp(Home());
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
字符串_advice='';
int _计数器=0;
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(
标题:文本(“应用程序1”),
标题:对,
),
正文:中(
子:容器(
填充:边缘设置。全部(32.0),
子:列(
儿童:[
//案文1-咨询意见
容器(
填充:所有边缘设置(16.0),
子:文本(
"建议",,
样式:TextStyle(
字体大小:20.0,
),
),
),
//文本2-计数器
正文(
“$”计数器“,
样式:TextStyle(fontSize:50,fontWeight:fontWeight.bold),
),
],
),
),
),
//浮动按钮
浮动操作按钮:浮动操作按钮(
子:图标(Icons.file_下载),
onPressed:_fetchPost,
),
),
);
}
_fetchPost()异步{
最终url=https://api.adviceslip.com/advice';
最终响应=等待http.get(url);
dynamicbody=json.decode(response.body);
//如果服务器返回OK响应,则解析JSON。
如果(response.statusCode==200){
打印(响应.正文);
设置状态(){
_通知=正文['slip']['advice'];
_计数器+=1;
});
}
//如果该响应不正常,则抛出一个错误。
否则{
//抛出异常(“加载post失败”);
打印('加载帖子失败');
}
}
}
使用类似isLoading的属性,并在执行请求前后对其进行设置
您还可以通过将onPressed设置为null来禁用FloatingActionButton。()
下面是使用这种方法的代码
导入'dart:convert';
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“package:shared_preferences/shared_preferences.dart”;
void main()=>runApp(Home());
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
字符串_advice='';
int _计数器=0;
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(
标题:文本(“应用程序1”),
标题:对,
),
正文:中(
子:容器(
填充:边缘设置。全部(32.0),
子:列(
儿童:[
//案文1-咨询意见
容器(
填充:所有边缘设置(16.0),
子:文本(
"建议",,
样式:TextStyle(
字体大小:20.0,
),
),
),
//文本2-计数器
正文(
“$”计数器“,
样式:TextStyle(fontSize:50,fontWeight:fontWeight.bold),
),
],
),
),
),
//浮动按钮
浮动操作按钮:浮动操作按钮(
子:图标(Icons.file_下载),
//通过将此属性设置为null,可以禁用FAB
onPressed:isLoading?null:\u fetchPost,
),
),
);
}
布尔孤岛加载;
设置加载(bool状态)=>setState(()=>isLoading=state));
_fetchPost()asnyc{
试一试{
设置加载(真);
等待_fetchData();
}最后{
设置加载(假);
}
}
_fetchData()异步{
最终url=https://api.adviceslip.com/advice';
最终响应=等待http.get(url);
dynamicbody=json.decode(response.body);
//如果服务器返回OK响应,则解析JSON。
如果(response.statusCode==200){
打印(响应.正文);
设置状态(){
_通知=正文['slip']['advice'];
_计数器+=1;
});
}
//如果该响应不正常,则抛出一个错误。
否则{
//抛出异常(“加载post失败”);
打印('加载帖子失败');
}
}
}
您是否使用bloc模式,如果是这样,您可以将按钮包装到流生成器中。此StreamBuilder侦听“BehaviorSubject buttonEnabled”。启动请求时,请执行“buttonEnabled.sink.add(false);”。当请求完成时,您执行“buttonEnabled.sink.add(true);”在按钮中,您只需将snapshot.data用于已启用的参数。