如何从rest api获取flutter中材料数据表中的数据

时间:2020-12-25 11:21:37

标签: flutter dart datatable

我想在材料 dataTable 中显示数据,但不是在一行中获取数据,而是每次都使表头与行一起

我想要的设计: Design I want

我现在得到的设计: Design I'm getting

这是我的 Flutter 应用程序的完整代码:

UI SCREEN
 ________________This is Ui part of my application_

import 'package:aiims/bloc/add_relatives_bloc.dart';
import 'package:aiims/models/relative.dart';
import 'package:aiims/service/api.dart';
import 'package:aiims/widgets/side_menu_widget.dart';
import 'package:flutter/material.dart';
import 'package:outline_material_icons/outline_material_icons.dart';
import 'package:provider/provider.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';

class RelativeScreen extends StatefulWidget {
  @override
  _RelativeScreenState createState() => _RelativeScreenState();
}

class _RelativeScreenState extends State<RelativeScreen> {
  GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  DataRow getDataRow(data) {
    return DataRow(
      cells: <DataCell>[
        DataCell(Text(data["name"])),
        DataCell(Text(data["age"])),
        DataCell(Text(data["relation"])),
        DataCell(
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Icon(Icons.edit_outlined),
              Icon(Icons.delete_outline_sharp),
            ],
          ),
        ),
      ],
    );
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    // _getDataRow(list.length);
  }

  // _getRelatives() {
  //   getRelativesList().then((Relative) {
  //     setState(() {
  //
  //     });
  //     print("Length: ${_relative.length}");
  //   });
  // }
  // DataRow _getDataRow(list) {
  //   return DataRow(
  //     cells: <DataCell>[
  //       DataCell(Text(list["name"])),
  //       DataCell(Text(list["age"])),
  //       DataCell(Text(list["relation"])),
  //     ],
  //   );
  // }

  @override
  Widget build(BuildContext context) {
    final bloc = Provider.of<AddNewRelativeBloc>(context, listen: false);
    return Scaffold(
      drawer: NavDrawer(),
      appBar: AppBar(
        title: Text('Relatives'),
        actions: <Widget>[
          GestureDetector(
            onTap: () => _add_relavitves(),
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 16.0),
              child: Icon(Icons.add_circle_outline_rounded),
            ),
          ),
        ],
      ),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(5.0),
          child: Container(
            // alignment: Alignment.center,
            padding: EdgeInsets.symmetric(vertical: 20),
            child: SingleChildScrollView(
              child: Container(
                child: FutureBuilder(
                    future: getRelativesList(),
                    // initialData: new TreatmentDetail(),
                    builder: (context, snapshot) {
                      if (snapshot.hasError) {
                        return Center(
                          child: Text(snapshot.error.toString()),
                        );
                      } else if (snapshot.connectionState ==
                          ConnectionState.done) {
                        return ListView.builder(
                            scrollDirection: Axis.vertical,
                            shrinkWrap: true,
                            itemCount: list.length,
                            itemBuilder: (context, index) {
                              return DataTable(
                                headingRowColor: MaterialStateColor
                                    .resolveWith(
                                        (states) => Color(0xffff69b4)),
                                // MaterialStateColor.resolveWith((states) => Colors.pink),
                                columns: [
                                  DataColumn(label: Text("Name")),
                                  DataColumn(label: Text("Age")),
                                  DataColumn(label: Text("Relation")),
                                  DataColumn(label: Text("Action")),
                                ],
                                // rows: List.generate(
                                //   list.length, (index) =>
                                //     _getDataRow(list[index]),
                                // ));
                                rows: [
                                  DataRow(
                                    cells: [
                                      DataCell(Text(list[index]["name"])),
                                      DataCell(Text(list[index]["age"])),
                                      DataCell(Text(list[index]["relation"])),
                                      DataCell(
                                        Row(
                                          mainAxisAlignment:
                                          MainAxisAlignment.spaceBetween,
                                          children: [
                                            Icon(Icons.edit_outlined),
                                            Icon(Icons.delete_outline_sharp),
                                          ],
                                        ),
                                      ),
                                    ],
                                  ),
                                  // DataRow(cells: [
                                  //   DataCell(Text('Ajay Singh')),
                                  //   DataCell(Text('25')),
                                  //   DataCell(Text('Son')),
                                  //   DataCell(
                                  //     Row(
                                  //       mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                  //       children: [
                                  //         Icon(Icons.edit_outlined),
                                  //         Icon(Icons.delete_outline_sharp),
                                  //       ],
                                  //     ),
                                  //   ),
                                  // ]),
                                ],
                              );
                            });
                      } else {
                        return Center(
                          child: CircularProgressIndicator(),
                        );
                      }
                    }),
              ),
            ),
          ),
        ),
      ),
    );
  }

  void _add_relavitves() {
    final bloc = Provider.of<AddNewRelativeBloc>(context, listen: false);
    // set up the buttons
    // Widget cancelButton = FlatButton(
    //   child: Text("Cancel"),
    //   onPressed: () {
    //     Navigator.pop(context);
    //   },
    // );
    Widget cancelButton = MaterialButton(
      child: Container(
        height: 40,
        width: 110,
        alignment: Alignment.center,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(20),
          color: Color(0xffff69b4),
        ),
        child: Text(
          "Discard",
          style: TextStyle(
            color: Colors.white,
            fontSize: 20,
          ),
        ),
      ),
      onPressed: () {
        Navigator.pop(context);
      },
    );

    Widget continueButton = FlatButton(
      child: Text("Continue"),
      onPressed: () {},
    );

    // set up the AlertDialog
    AlertDialog alert = AlertDialog(
      title: Center(
        child: Text(
          "Add New Relative",
          style: TextStyle(
            fontSize: 20,
            fontWeight: FontWeight.bold,
          ),
        ),
      ),
      content: SingleChildScrollView(
        child: Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              SizedBox(height: 20),
              StreamBuilder<Object>(
                  stream: bloc.name,
                  builder: (context, snapshot) {
                    return TextField(
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                        hintText: "Name",
                        labelText: "Name",
                        errorText: snapshot.error,
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                      ),
                      // onChanged: (value) => bloc.changeName,
                      onChanged: bloc.changeName,
                    );
                  }),
              SizedBox(height: 20),
              StreamBuilder<Object>(
                  stream: bloc.age,
                  builder: (context, snapshot) {
                    return TextField(
                      keyboardType: TextInputType.number,
                      decoration: InputDecoration(
                        hintText: "Age",
                        labelText: "Age",
                        errorText: snapshot.error,
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                      ),
                      // onChanged: (value) => bloc.changeName,
                      onChanged: bloc.changeAge,
                    );
                  }),
              SizedBox(height: 20),
              StreamBuilder<Object>(
                  stream: bloc.relation,
                  builder: (context, snapshot) {
                    return TextField(
                      keyboardType: TextInputType.text,
                      decoration: InputDecoration(
                        hintText: "Relation",
                        labelText: "Relation",
                        errorText: snapshot.error,
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                      ),
                      // onChanged: (value) => bloc.changeName,
                      onChanged: bloc.changeRelation,
                    );
                  }),
              SizedBox(height: 20),
              StreamBuilder<Object>(
                  stream: bloc.phoneNumber,
                  builder: (context, snapshot) {
                    return TextField(
                      keyboardType: TextInputType.number,
                      decoration: InputDecoration(
                        hintText: "Phone Number",
                        labelText: "Phone Number",
                        errorText: snapshot.error,
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(10),
                        ),
                      ),
                      // onChanged: (value) => bloc.changeName,
                      onChanged: bloc.changePhoneNumber,
                    );
                  }),
            ],
          ),
        ),
      ),
      actions: [
        cancelButton,
        _saveButton(),
      ],
    );

    // show the dialog
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return alert;
      },
    );
  }

  Widget _saveButton() {
    final bloc = Provider.of<AddNewRelativeBloc>(context, listen: false);

    return StreamBuilder<Object>(
        stream: bloc.isValid,
        builder: (context, snapshot) {
          return GestureDetector(
            onTap: snapshot.hasError || !snapshot.hasData
                ? null
                : () {
              bloc.submit();
            },
            child: Container(
              height: 40,
              width: 130,
              alignment: Alignment.center,
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(20),
                color: snapshot.hasError || !snapshot.hasData
                    ? Color(0xffff69b4)
                    : Colors.green,
              ),
              child: Text(
                "Save",
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 20,
                ),
              ),
            ),
          );
        });
  }
}


//My Future for getting response from api
Future<List> getRelativesList() async {
  final response =
  await http.get("$baseUrl");
  Map<String, dynamic> map = json.decode(response.body);
  List<dynamic> data = map["data"];
  print("first id on console" + data[0]["id"].toString());
  return list = data;
}


//Here is my model
class Relative {
  int _code;
  String _message;
  List<Data> _data;

  Relative({int code, String message, List<Data> data}) {
    this._code = code;
    this._message = message;
    this._data = data;
  }

  int get code => _code;
  set code(int code) => _code = code;
  String get message => _message;
  set message(String message) => _message = message;
  List<Data> get data => _data;
  set data(List<Data> data) => _data = data;

  Relative.fromJson(Map<String, dynamic> json) {
    _code = json['code'];
    _message = json['message'];
    if (json['data'] != null) {
      _data = new List<Data>();
      json['data'].forEach((v) {
        _data.add(new Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['code'] = this._code;
    data['message'] = this._message;
    if (this._data != null) {
      data['data'] = this._data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Data {
  int _id;
  int _patientId;
  String _name;
  String _age;
  String _relation;
  String _phoneNo;

  Data(
      {int id,
        int patientId,
        String name,
        String age,
        String relation,
        String phoneNo}) {
    this._id = id;
    this._patientId = patientId;
    this._name = name;
    this._age = age;
    this._relation = relation;
    this._phoneNo = phoneNo;
  }

    enter code here

  int get id => _id;
  set id(int id) => _id = id;
  int get patientId => _patientId;
  set patientId(int patientId) => _patientId = patientId;
  String get name => _name;
  set name(String name) => _name = name;
  String get age => _age;
  set age(String age) => _age = age;
  String get relation => _relation;
  set relation(String relation) => _relation = relation;
  String get phoneNo => _phoneNo;
  set phoneNo(String phoneNo) => _phoneNo = phoneNo;

  Data.fromJson(Map<String, dynamic> json) {
    _id = json['id'];
    _patientId = json['patient_id'];
    _name = json['name'];
    _age = json['age'];
    _relation = json['relation'];
    _phoneNo = json['phone_no'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this._id;
    data['patient_id'] = this._patientId;
    data['name'] = this._name;
    data['age'] = this._age;
    data['relation'] = this._relation;
    data['phone_no'] = this._phone`enter code here`No;
    return data;
  }
}

0 个答案:

没有答案
相关问题