Flutter 如何禁用按钮,直到http请求加载到Flatter中?

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

我正在尝试实现一个颤振应用程序,从API端点获取数据。我已经在按下按钮时实现了fetch函数

尽管如此,我希望在获取请求时禁用该按钮(以避免多次单击)

我使用darthttp包实现了它

以下是我的代码:

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用于已启用的参数。