Приложение получает Cra sh в приложении флаттера после отправки данных формы на базу - PullRequest
0 голосов
/ 31 марта 2020

Я создавал форму, в которой можно хранить информацию о пациенте.

Я использую правильный API и сохраняю данные на сервере, но после отправки сведений о форме на сервер мое приложение получает sh и начать показывать черный экран.

Это страница формы с полями, я сократил этот код:

 import 'package:flutter/material.dart';
import '../models/patient.dart';

//Third Party package
import 'package:provider/provider.dart';
//Providers
import '../providers/patient.dart';

class AddPatientDetail extends StatefulWidget {
  static const routeName = '/addPatientDetails';
  @override
  _AddPatientDetailState createState() => _AddPatientDetailState();
}

class _AddPatientDetailState extends State<AddPatientDetail> {
  // final scaffoldKey = new GlobalKey<ScaffoldState>();
  final _formKey = new GlobalKey<FormState>();
  final _genderFocusNode = FocusNode();
  final _ageFocusNode = FocusNode();
  final _occupationFocusNode = FocusNode();
  final _mobileNumberFocusNode = FocusNode();
  final _alternateMobileNumberFocusNode = FocusNode();
  final _adharNumberFocusNode = FocusNode();
  final _addressFocusNode = FocusNode();
  var _addNewPatient = Patient(
      id: null,
      name: '',
      gender: '',
      age: 0,
      occupation: '',
      mobileNumber: '',
      alternateMobileNumber: '',
      adharNumber: '',
      address: '');

  var _isLoading = false;

  @override
  void dispose() {
    _genderFocusNode.dispose();
    _ageFocusNode.dispose();
    _occupationFocusNode.dispose();
    _mobileNumberFocusNode.dispose();
    _alternateMobileNumberFocusNode.dispose();
    _adharNumberFocusNode.dispose();
    _addressFocusNode.dispose();
    super.dispose();
  }

  var _gender = ['Male', 'Female', 'Other'];
  var _currentSelectedGender = 'Male';
  void _selectGender(String gender) {
    setState(() {
      _currentSelectedGender = gender;
      print(_currentSelectedGender);
    });
  }

  void _addPatient() {
    final isValid = _formKey.currentState.validate();
    if (!isValid) {
      return;
    }
    _formKey.currentState.save();
    setState(() {
      _isLoading = true;
    });
    Provider.of<Patients>(context, listen: false)
        .addPatient(_addNewPatient)
        .catchError((error) {
      return showDialog(
        context: context,
        builder: (ctx) => AlertDialog(
          title: Text('An error occured'),
          content: Text(
            "Something went wrong",
          ),
          actions: <Widget>[
            FlatButton(
              onPressed: () {
                Navigator.of(ctx).pop();
                setState(() {
                  _isLoading = false;
                });
              },
              child: Text('Okay'),
            )
          ],
        ),
      );
    }).then((_) {
      setState(() {
        _isLoading = false;
      });
      Navigator.of(context).pop();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).accentColor,
        title: Text('New Patient'),
      ),
      backgroundColor: Theme.of(context).accentColor,
      body: _isLoading
          ? Center(
              child: CircularProgressIndicator(
                backgroundColor: Theme.of(context).primaryColor,
              ),
            )
          : SingleChildScrollView(
              child: Padding(
                padding: EdgeInsets.all(20.0),
                child: Form(
                    key: _formKey,
                    child: Column(
                      children: <Widget>[
                        TextFormField(
                          decoration: InputDecoration(labelText: 'Name '),
                          textInputAction: TextInputAction.next,
                          keyboardType: TextInputType.text,
                          onFieldSubmitted: (_) {
                            FocusScope.of(context)
                                .requestFocus(_genderFocusNode);
                          },
                          onSaved: (value) {
                            _addNewPatient = Patient(
                              id: null,
                              name: value,
                              gender: _addNewPatient.gender,
                              age: _addNewPatient.age,
                              occupation: _addNewPatient.occupation,
                              mobileNumber: _addNewPatient.mobileNumber,
                              alternateMobileNumber:
                                  _addNewPatient.alternateMobileNumber,
                              adharNumber: _addNewPatient.adharNumber,
                              address: _addNewPatient.address,
                            );
                          },
                          validator: (value) {
                            if (value.isEmpty) {
                              return 'Patient must be having a name';
                            }
                            return null;
                          },
                        ),

                        MaterialButton(
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(18),
                          ),
                          child: new Text(
                            'Add Patient',
                            style: new TextStyle(color: Colors.white),
                          ),
                          color: Theme.of(context).primaryColor,
                          onPressed: _addPatient,
                        )
                      ],
                    )),
              ),
            ),

    );
  }
}

Это страница поставщика медицинских услуг:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
// Internal Component
import '../models/patient.dart';
import '../widgets/api.dart';

class Patients with ChangeNotifier {
  var patient = Api.patientUrl;

  List<Patient> _items = [];

  List<Patient> get items {
    return [..._items];
  }



  // Add Patient
  Future<void> addPatient(Patient patient) async {
    // I have hidden firebase url on purpose
    const url = firebase.url; 


    try {
      final response = await http.post(
        url,
        body: json.encode(
          {
            'name': patient.name,
            'gender': patient.gender,
            'age': patient.age,
            'occupation': patient.occupation,
            'mobileNumber': patient.mobileNumber,
            'alternateMobileNumber': patient.alternateMobileNumber,
            'adharNumber': patient.adharNumber,
            'address': patient.address
          },
        ),
      );

      final res = json.decode(response.body);
      final newPatient = Patient(
          id: res['name'],
          name: patient.name,
          gender: patient.gender,
          age: patient.age,
          occupation: patient.occupation,
          mobileNumber: patient.mobileNumber,
          alternateMobileNumber: patient.alternateMobileNumber,
          adharNumber: patient.adharNumber,
          address: patient.address);

      print(newPatient);
      _items.add(newPatient);
      notifyListeners();
    } catch (error) {
      throw error;
    }
  }

Я полностью сбит с толку, потому что с меньшим количеством пар ключ-значение он работал нормально, но теперь он снова и снова получает cra sh.

Я использовал чистый флаттер, но мое приложение получение крэ sh.

...