如何在Fluent中导航到Post Api成功响应上的其他屏幕

时间:2019-12-04 09:59:57

标签: android flutter

在我的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;
  }
}


有人可以告诉我我在哪里做错了吗?

1 个答案:

答案 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);
    }