Я создавал форму, в которой можно хранить информацию о пациенте.
Я использую правильный 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.