【发布时间】:2020-03-29 02:18:09
【问题描述】:
在我的颤振应用程序中,我必须导航到 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;
}
}
谁能告诉我哪里做错了?
【问题讨论】:
-
尝试从
navigateToSubPagevoid navigateToSubPage(context){ Navigator.push( context, MaterialPageRoute(builder: (context) => SecondPage())); }删除future和async -
不需要 Future 和异步到你的
navigateToSubPage方法。而 FutureBuilde 是 Widget 的类型,它应该始终只在 Widget 方法中。 -
@RavinderKumar 仍然无法正常工作
-
您是否使用 API 进行身份验证?
-
@satish 我已经实现了一个登录 api