在我的flutter应用程序中,我必须导航到Api成功响应上的其他屏幕。
我的应用程序中有一个登录屏幕,我必须调用Post api进行用户登录,并且在该Api成功响应后,我想转到其他屏幕上
以下是我完成的代码
import 'package:flutter/material.dart';
import 'package:flutter_login_app/screens/login.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
),
home: Login(),
);
}
}
我的登录课程的代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_login_app/models/LoginApiResponse.dart';
import 'package:flutter_login_app/models/UserLoginModel.dart';
import 'package:flutter_login_app/network/services.dart';
import 'package:flutter_login_app/screens/second_page.dart';
class Login extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new LoginState();
}
}
class LoginState extends State<Login> {
TextEditingController usrNameController = new TextEditingController();
TextEditingController passController = new TextEditingController();
@override
void dispose() {
// Clean up the controller when the widget is disposed.
usrNameController.dispose();
passController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
title: Text("Login"),
centerTitle: true,
),
body: Align(
alignment: Alignment.center,
child: new Container(
child: new ListView(
children: <Widget>[
new Container(
margin: const EdgeInsets.all(20.0),
child: new Column(
children: <Widget>[
new TextField(
controller: usrNameController,
decoration: new InputDecoration(
hintText: "Enter user name",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0)),
),
),
new Padding(
padding: new EdgeInsets.fromLTRB(0, 20, 0, 0)),
new TextField(
controller: passController,
obscureText: true,
decoration: new InputDecoration(
hintText: "Enter password",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(5.0)),
),
),
new Padding(
padding: new EdgeInsets.fromLTRB(0, 20, 0, 0)),
SizedBox(
width: double.infinity,
height: 55,
child: new RaisedButton(
onPressed: () {
_doLogin(context);
},
child: new Text("Login"),
))
],
),
)
],
),
),
));
}
void _doLogin(BuildContext context) {
String username = usrNameController.text;
String password = passController.text;
User user = new User(User_ID: username, Password: password);
ApiService apiService = new ApiService();
print("hello");
Future<LoginApiResponse>loginresponse = apiService.getLogin("Authenticate", body: user.toMap());
print("hello");
FutureBuilder<LoginApiResponse>(
future: loginresponse,
builder: (BuildContext context, AsyncSnapshot<LoginApiResponse> snapshot) {
print("hello");
print(snapshot.data.code);
print(snapshot.data.message);
navigateToSubPage(context);
});
}
Future navigateToSubPage(context) async {
Navigator.push(
context, MaterialPageRoute(builder: (context) => SecondPage()));
}
}
ApiService类代码
import 'dart:convert';
import 'dart:io';
import 'package:flutter_login_app/models/LoginApiResponse.dart';
import 'package:http/http.dart' as http;
class ApiService{
String _baseUrl ="http://myloginapi/";
Future<LoginApiResponse>getLogin(String _methodName, {Map body})async{
final response = await http.post(_baseUrl + _methodName,body: body);
//int statusCode = response.statusCode;
if (response.statusCode == 200) {
return LoginApiResponse.fromJson(json.decode(response.body));
}else{
// If that response was not OK, throw an error.
throw Exception('Failed to load post');
}
}
}
LoginApiResponse的代码
class LoginApiResponse {
String code;
String message;
LoginApiResponse({this.code, this.message});
factory LoginApiResponse.fromJson(Map<String, dynamic>json){
return LoginApiResponse(
code : json['Code'],
message : json['Message']
);
}
Map toMap() {
var map = new Map<String, dynamic>();
map["Code"] = code;
map["Message"] = message;
return map;
}
}
有人可以告诉我我在哪里做错了吗?
答案 0 :(得分:0)
我可以看到您的getLogin方法是将来的类型。等待和异步将处理您将来的呼叫,而无需FutureBuilder
。
void _doLogin(BuildContext context)async {
String username = usrNameController.text;
String password = passController.text;
User user = new User(User_ID: username, Password: password);
ApiService apiService = new ApiService();
print("hello");
final loginresponse =
await apiService.getLogin("Authenticate", body: user.toMap());
if(loginresponse.responce.statusCode!=200){
throw Exception("error")
}
else {
navigateToSubPage(context);
}
}
您还需要返回响应
Future<LoginApiResponse>getLogin(String _methodName, {Map body})async{
final response = await http.post(_baseUrl + _methodName,body: body);
//int statusCode = response.statusCode;
if (response.statusCode == 200) {
return LoginApiResponse.fromJson(json.decode(response.body));
}else{
// If that response was not OK, throw an error.
throw Exception('Failed to load post');
}
return LoginApiResponse(response);
}
class LoginApiResponse {
final Responce response;
LoginApiResponse(this.response);
}