async/await 在 Flutter 的登录页面中执行 CircularProgressIndicator
async/await to do CircularProgressIndicator in a Login Page in Flutter
我在登录页面中遇到 CircularProgressIndicator 问题。我想这样做。当用户点击 "log in" 按钮时,我希望该应用程序创建一个 CircularProgressIndicator 并踢出 raisedButton 文本并添加 CircularProgessIdnicator,然后我的应用程序从我的 web 服务获取数据我想停止 CircularProgessIndicator。有小费吗?谢谢。
实际代码(你可以毫无问题地编译它,只需在依赖项中添加 http:^0.12.0)。
实际系统照片:
First step of login
Progress bar that I want to implement (I want to kick the raisedButton for a while)
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MaterialApp(home:MyApp()));
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool estaCargando = false;
TextEditingController user = TextEditingController();
TextEditingController phone = TextEditingController();
Future<List> _loginn() async {
var url = "https://pruebasxaviervelez.000webhostapp.com/login.php";
final response = await http
.post(url, body: {"usuario": user.text, "telefono": phone.text});
print(response.body);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: Colors.pink,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 100,
width: 100,
child: TextField(
controller: user,
decoration: InputDecoration(hintText: 'username'),
),
),
Container(
height: 100,
width: 100,
child: TextField(
controller: phone,
decoration: InputDecoration(hintText: 'password'),
),
),
RaisedButton(
child: Text('Log in'),
onPressed: (){
_loginn();
},
)
],
),
)),
);
}
}
可以,如果用户单击按钮,只需调用 setState() 方法。
bool _loading = false;
!_loading ? RaisedButton(
child: Text('Log in'),
onPressed: (){
_loginn();
setState(() => _loading = true);
},
) : CircularProgressIndicator();
如果用户点击,那么它将 setState _loading bool 设置为 true 并且小部件将重建为 Progress Indicator
另外,获取数据后再次调用 setState 方法。
只需更改代码如下,
// Inside your _MyAppState class
bool isLoading = false;
// Inside your build method
isLoading ? RaisedButton(
child: Text('Log in'),
onPressed: async(){
setState((){
isLoading=true;
});
await _loginn();
setState((){
isLoading=false;
});
},
)
: Center(child:CircularProgressIndicator())
当您按下按钮时,我们首先通过 setState 方法将进度指示器的加载状态更改为 true,这将重新呈现 UI。
然后使用 await 关键字编写 async loginn() 方法将等待该方法执行。
然后它将使用 setState 方法将进度指示器状态更改为 false,这将再次重新呈现 UI。
我在登录页面中遇到 CircularProgressIndicator 问题。我想这样做。当用户点击 "log in" 按钮时,我希望该应用程序创建一个 CircularProgressIndicator 并踢出 raisedButton 文本并添加 CircularProgessIdnicator,然后我的应用程序从我的 web 服务获取数据我想停止 CircularProgessIndicator。有小费吗?谢谢。
实际代码(你可以毫无问题地编译它,只需在依赖项中添加 http:^0.12.0)。
实际系统照片:
First step of login
Progress bar that I want to implement (I want to kick the raisedButton for a while)
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MaterialApp(home:MyApp()));
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool estaCargando = false;
TextEditingController user = TextEditingController();
TextEditingController phone = TextEditingController();
Future<List> _loginn() async {
var url = "https://pruebasxaviervelez.000webhostapp.com/login.php";
final response = await http
.post(url, body: {"usuario": user.text, "telefono": phone.text});
print(response.body);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: Colors.pink,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 100,
width: 100,
child: TextField(
controller: user,
decoration: InputDecoration(hintText: 'username'),
),
),
Container(
height: 100,
width: 100,
child: TextField(
controller: phone,
decoration: InputDecoration(hintText: 'password'),
),
),
RaisedButton(
child: Text('Log in'),
onPressed: (){
_loginn();
},
)
],
),
)),
);
}
}
可以,如果用户单击按钮,只需调用 setState() 方法。
bool _loading = false;
!_loading ? RaisedButton(
child: Text('Log in'),
onPressed: (){
_loginn();
setState(() => _loading = true);
},
) : CircularProgressIndicator();
如果用户点击,那么它将 setState _loading bool 设置为 true 并且小部件将重建为 Progress Indicator
另外,获取数据后再次调用 setState 方法。
只需更改代码如下,
// Inside your _MyAppState class
bool isLoading = false;
// Inside your build method
isLoading ? RaisedButton(
child: Text('Log in'),
onPressed: async(){
setState((){
isLoading=true;
});
await _loginn();
setState((){
isLoading=false;
});
},
)
: Center(child:CircularProgressIndicator())
当您按下按钮时,我们首先通过 setState 方法将进度指示器的加载状态更改为 true,这将重新呈现 UI。
然后使用 await 关键字编写 async loginn() 方法将等待该方法执行。
然后它将使用 setState 方法将进度指示器状态更改为 false,这将再次重新呈现 UI。