我从登录API得到json正文的响应我为该json创建了模型类现在如何在我的页面中使用它来获取数据?

问题描述

我已经从api登录。然后我得到了json的响应。我可以从登录页面获取数据。为此,我在主页中创建了一个构造函数,并将其传递给登录页面,在该页面中我为主页创建了导航器。但是我知道获取这样的数据不是一个好习惯。使用模型类是更聪明的方法。我在此处添加登录名,主页和模型的代码。现在我的数据只能在这两个页面之间进行通信。但是我也需要将数据提取到另一个页面

login.dart

    import 'package:api_login/model/response_model.dart';
import 'package:Flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import '../sharePreference.dart';
import 'homepage.dart';


class Login extends StatefulWidget {
  UserDetails userDetails = new UserDetails();
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {

var notification ;
  bool isprocesscomplete = false;
  TextEditingController _userController = TextEditingController();
  TextEditingController _passwordController = TextEditingController();
  final _scaffoldKey = GlobalKey<ScaffoldState>();
  String BaseUrl = "my url";


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,body: SingleChildScrollView(
        child: Center(
          child: Container(
            height: 770,color:  Colors. lightBlue,padding: EdgeInsets.fromLTRB(20,100,20,20),child: Column(
              mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [

                Text(
                  "Login",style: TextStyle(fontSize: 32),),SizedBox(
                  height: 30,Card(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(20),child: Container(
                    height: 220,width: MediaQuery.of(context).size.width,decoration: Boxdecoration(
                      borderRadius: BorderRadius.circular(20),child: Column(
                      children: [
                        Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _userController,decoration: Inputdecoration(hintText: "Username"),Padding(
                          padding: const EdgeInsets.all(30),child: TextField(
                            controller: _passwordController,obscureText: true,decoration: Inputdecoration(hintText: "Password"),],SizedBox(
                  height: 60,child: RaisedButton(
                    color: Colors.blue,onpressed: () {
                      if (_userController.text == "" ||
                          _passwordController.text == "") {
                        final snackBar = SnackBar(
                            content: Text("Enter Username and Password"));
                        _scaffoldKey.currentState.showSnackBar(snackBar);
                      } else {
                        signIn(_userController.text,_passwordController.text);
                      }
                    },child: ProgressButton(),shape: RoundedRectangleBorder(
                      borderRadius: new BorderRadius.circular(16),SizedBox(
                  height: 20,FlatButton(
                  child: Text("Forgot password"),onpressed: () {},);
  }

  Widget ProgressButton() {
    if (isprocesscomplete != false) {
      return CircularProgressIndicator(
          valueColor: AlwaysstoppedAnimation<Color>(Colors.white));
    } else {
      return new Text(
        "Sign In",style: const TextStyle(
          color: Colors.white,fontSize: 15.0,);
    }
  }

  void signIn(String username,String password) async {
    setState(() {
      isprocesscomplete = true;
    });
    var response = await http.post(BaseUrl,headers: {"Content-Type": "application/json"},body: json.encode({
          "username": username,"password": password,}));

    Map<String,dynamic> value = json.decode(response.body);
    notification = value["notifications"];
    // print('Response ${response.body}');
    if (response.statusCode == 200) {
      try {
        ///You don't need it but it will be cool for show progress dialgo for 4 second then redirect even if we get reslut
        Future.delayed(Duration(seconds: 4),() {
          // 5s over make it false
          setState(() {
            isprocesscomplete = true;
          });
        });
        Map<String,dynamic> value = json.decode(response.body);
        print('Response ${response.body}');
        SharedPrefrence().setToken(value['api_token'].toString());
        SharedPrefrence().setName(value['user_name']);
        SharedPrefrence().setUserId(value['user_id'].toString());

        ///This is used when user loged in you can set this true,///next time you open you need to check loginc in main.dart or splashscreen if this is true if it is true then
        ///redirect to home page it is false then redirect to Login page
        ///When you logout the app make sure you set this as false like "SharedPrefrence().setLoggedIn(false);"
        SharedPrefrence().setLoggedIn(true);

        ///Redirect to Home page
        Navigator.pushAndRemoveUntil(
                                context,MaterialPageRoute(
                                    builder: (context) => HomePage(
                                      user_name: value['user_name'],api_token: value['api_token'],notification: notification,// payment: payment,)),ModalRoute.withName("/login"));

      } catch (e) {
        e.toString();
        final snackBar =
        SnackBar(
            content: Text("something wrong,Try again ?"),behavior: SnackBarBehavior.floating,);
        _scaffoldKey.currentState.showSnackBar(snackBar);
      }
    } else {
      var message = value['error'];
      final snackBar = SnackBar( backgroundColor: Colors.redAccent[700],content: Text(message.toString()),);
      _scaffoldKey.currentState.showSnackBar(snackBar);
    }
  }
}

homepage.dart

    import 'package:api_login/model/response_model.dart';
import 'package:api_login/pages/details.dart';
import 'package:api_login/pages/settingPage.dart';
import 'package:api_login/widget/neumorphsm.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../sharePreference.dart';
import 'login.dart';
import 'login.dart';

class HomePage extends StatefulWidget {
 final payment;
  final count ;
  String user_name;
  final api_token;
  final user_id ;
  final payment_id;
  final  List<dynamic> notification ;
  // List data ;
  HomePage({ this.user_name,this.api_token,this.user_id,@required this.notification,this.count,this.payment,this.payment_id});


  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  String arrayLength ;
  String nametoprint;
  String tokentoprint;

  @override
  void initState() {
    super.initState();
    Future name = SharedPrefrence().getName();
    name.then((data) async {
      nametoprint = data;
      print(nametoprint);
    });
    Future token= SharedPrefrence().getToken();
    token.then((data) async {
      tokentoprint= data;
      print(tokentoprint);
    });
  }
  int counter ;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(

          title: Text("Cash-Management"),backgroundColor: Colors.blue,actions: [
            new Stack(
              children: <Widget>[
                new IconButton(icon: Icon(Icons.notifications),onpressed: () {
                  setState(() {
                    counter = 0;
                  });
                }),counter != 0 ? new Positioned(
                  right: 11,top: 11,child: new Container(
                    padding: EdgeInsets.all(2),decoration: new Boxdecoration(
                      color: Colors.red,borderRadius: BorderRadius.circular(6),constraints: BoxConstraints(
                      minWidth: 14,minHeight: 14,child: Text(
                      "  ${widget.notification.length} ",style: TextStyle(
                        color: Colors.white,fontSize: 8,textAlign: TextAlign.center,) : new Container()
              ],IconButton(
                icon: Icon(Icons.exit_to_app),onpressed: () {
                  Navigator.push(
                    context,MaterialPageRoute(builder: (context) => Login()),);
                }),body: ListView(
          children: <Widget>[
            Card(
              color: Colors.lightBlue,child: InkWell(
                onTap: () {
                  Navigator.push(
                      context,new MaterialPageRoute(
                          builder: (BuildContext context) =>
                          new SettingPage()));
                },child: Container(
                  height: 120,child: Column(

                   mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
                      Text(
                        "Profile",style: TextStyle(fontSize: 18,fontWeight: FontWeight.bold),Text(
                        "Name:${widget.user_name}",// "  ${widget.username} ",style: TextStyle(fontSize: 16),// Text(
                      //   "  ${widget.notification.length} ",// Text(" ${nametoprint} "),Container(
  color: Colors.lightBlue,height: 400,child:   ListView.builder(
      itemCount: widget.notification == null ?  0 : widget.notification.length,itemBuilder: (context,index){
        final count = widget.notification ;
                   print(count.length);
        return Card(

            color: Colors.blue,child: InkWell(
              onTap: () {
                Navigator.push(
                    context,new MaterialPageRoute(
                        builder: (BuildContext context) =>
                        new DetailPage()));
              },child: Column(
                children:<Widget>[
Text('Amount'),ListTile(
                 title: Text(widget.notification[index] ["data"]["amount"].toString()),subtitle: Text(widget.notification[index]["data"]["message"].toString()),Text('Created at '),ListTile(
                    title: Text(widget.notification[index] ["created_at"].toString()),Text('updated at'),ListTile(
                    title: Text(widget.notification[index] ["updated_at"].toString()),);
      }),Container(
              color: Colors.blue,height: 130,child: Button()
            ),// floatingActionButton: FloatingActionButton(onpressed: () {
        //   print("Increment Counter");
        //   setState(() {
        //     counter++;
        //   });
        // },child: Icon(Icons.add),);


  }

}

response_model.dart

class UserDetails {
  int userId;
  String userName;
  String apiToken;
  List<Notifications> notifications;

  UserDetails({this.userId,this.userName,this.apiToken,this.notifications});

  UserDetails.fromJson(Map<String,dynamic> json) {
    userId = json['user_id'];
    userName = json['user_name'];
    apiToken = json['api_token'];
    if (json['notifications'] != null) {
      notifications = new List<Notifications>();
      json['notifications'].forEach((v) {
        notifications.add(new Notifications.fromJson(v));
      });
    }
  }

  Map<String,dynamic> toJson() {
    final Map<String,dynamic> data = new Map<String,dynamic>();
    data['user_id'] = this.userId;
    data['user_name'] = this.userName;
    data['api_token'] = this.apiToken;
    if (this.notifications != null) {
      data['notifications'] =
          this.notifications.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Notifications {
  String id;
  String type;
  int notifiableId;
  String notifiableType;
  Data data;
  Null readAt;
  String createdAt;
  String updatedAt;

  Notifications(
      {this.id,this.type,this.notifiableId,this.notifiableType,this.data,this.readAt,this.createdAt,this.updatedAt});

  Notifications.fromJson(Map<String,dynamic> json) {
    id = json['id'];
    type = json['type'];
    notifiableId = json['notifiable_id'];
    notifiableType = json['notifiable_type'];
    data = json['data'] != null ? new Data.fromJson(json['data']) : null;
    readAt = json['read_at'];
    createdAt = json['created_at'];
    updatedAt = json['updated_at'];
  }

  Map<String,dynamic>();
    data['id'] = this.id;
    data['type'] = this.type;
    data['notifiable_id'] = this.notifiableId;
    data['notifiable_type'] = this.notifiableType;
    if (this.data != null) {
      data['data'] = this.data.toJson();
    }
    data['read_at'] = this.readAt;
    data['created_at'] = this.createdAt;
    data['updated_at'] = this.updatedAt;
    return data;
  }
}

class Data {
  int paymentId;
  String generatePaymentId;
  String message;
  int amount;

  Data({this.paymentId,this.generatePaymentId,this.message,this.amount});

  Data.fromJson(Map<String,dynamic> json) {
    paymentId = json['payment_id'];
    generatePaymentId = json['generate_payment_id'];
    message = json['message'];
    amount = json['amount'];
  }

  Map<String,dynamic>();
    data['payment_id'] = this.paymentId;
    data['generate_payment_id'] = this.generatePaymentId;
    data['message'] = this.message;
    data['amount'] = this.amount;
    return data;
  }
}

如果有人让您知道如何显示此部分的详细信息页面,这将很有帮助。

ListView.builder(
      itemCount: widget.notification == null ?  0 : widget.notification.length,

解决方法

您可以在首页中使用widget.user_namewidget.api_token,并将其传递到详细信息页面。

主页

Navigator.push(
      context,new MaterialPageRoute(
       builder: (BuildContext context) =>
         new DetailPage(userName :widget.user_name,apiToken: widget.api_token)));
,

如果要在应用程序中全局使用数据,也许可以在MaterialApp()之前从API提取数据,以便可以全局使用数据。

其他方法是,可以通过在Navigator.push()中调用它们来将UserDetails()数据传递到下一页。您可以阅读更多详细示例quite simple in ReactiveUI's RoutingState