我是颤振新手。我连接到本地 API。我收到错误:
连接终止
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
class Registration extends StatefulWidget {
const Registration({Key? key}) : super(key: key);
@override
State<Registration> createState() => _RegistrationState();
}
class _RegistrationState extends State<Registration> {
TextEditingController _first_controller = TextEditingController();
TextEditingController _last_controller = TextEditingController();
TextEditingController _address_controller = TextEditingController();
TextEditingController _email_controller = TextEditingController();
TextEditingController _phone_controller = TextEditingController();
TextEditingController _gender_controller = TextEditingController();
TextEditingController _password_controller = TextEditingController();
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
resizeToAvoidBottomInset: false,
appBar: AppBar(
centerTitle: true,
title: Text('Registration',
style: TextStyle(
fontSize: MediaQuery.of(context).size.width / 12,
fontWeight: FontWeight.normal,
fontStyle: FontStyle.italic,
color: Colors.white)),
),
body: SafeArea(
child: SingleChildScrollView(
child: Form(
key: _formkey,
child: Container(
height: MediaQuery.of(context).size.height / 1,
child: Column(
children: [
Align(
alignment: Alignment.center,
child: Padding(
padding:
EdgeInsets.all(MediaQuery.of(context).size.width / 12),
child: Column(
children: [
TextFormField(
textInputAction: TextInputAction.next,
controller: _first_controller,
keyboardType: TextInputType.name,
decoration: InputDecoration(
labelText: 'First Name',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon:
const Icon(Icons.person_add_alt_1_outlined),
),
validator: (value) {
if (value == null || value == "") {
return "Please Enter First Name ";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.next,
controller: _last_controller,
keyboardType: TextInputType.name,
decoration: InputDecoration(
labelText: 'Last Name',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon:
const Icon(Icons.person_add_alt_1_outlined),
),
validator: (value) {
if (value == null || value == "") {
return "Please Enter Last Name ";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.next,
controller: _address_controller,
keyboardType: TextInputType.streetAddress,
decoration: InputDecoration(
labelText: 'Address',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon:
const Icon(Icons.location_city_outlined),
),
validator: (value) {
if (value == null || value == "") {
return "Please Enter Address ";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.next,
controller: _phone_controller,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'Phone Number',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon:
const Icon(Icons.mobile_friendly_outlined),
),
validator: (value) {
if (value == null ||
value == "" ||
value.length < 8) {
return "Please Enter Valid Mobile Number ";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.next,
controller: _email_controller,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
labelText: 'E-mail',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon: const Icon(Icons.email_outlined),
),
validator: (value) {
if (value == null || value == "") {
return "Please Enter E-mail ";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.next,
controller: _gender_controller,
keyboardType: TextInputType.text,
decoration: InputDecoration(
labelText: 'Gender',
helperText: 'Choice M or F',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon: const Icon(Icons.male_outlined),
),
validator: (value) {
if (value == null || value == "") {
return "Please Enter Gender";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
TextFormField(
textInputAction: TextInputAction.done,
controller: _password_controller,
keyboardType: TextInputType.visiblePassword,
decoration: InputDecoration(
labelText: 'Password',
helperText: 'Minimum strength = 3',
labelStyle: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22),
border: const OutlineInputBorder(),
suffixIcon: const Icon(Icons.visibility),
),
validator: (value) {
if (value == null ||
value == "" ||
value.length < 3) {
return "Please Enter Valid Password";
} else {
return null;
}
},
),
SizedBox(
height: MediaQuery.of(context).size.height / 50,
),
ElevatedButton(
onPressed: () {
RegisterData();
},
child: Text(
'Register',
style: TextStyle(
fontSize:
MediaQuery.of(context).size.width / 22,
fontStyle: FontStyle.italic,
letterSpacing:
MediaQuery.of(context).size.width / 209),
),
)
],
),
),
)
],
),
),
),
)),
);
}
Future RegisterData() async {
var url = "https://192.168.2.109:8085/Users";
Map data = {
'firstName': _first_controller.text,
'lastName': _last_controller.text,
'address': _address_controller.text,
'phonenumber': _phone_controller.text,
'email': _email_controller.text,
'gender': _gender_controller.text,
'password': _password_controller.text,
};
print("JSON DATA: $data");
http.Response response = await http.post(Uri.parse(url), body: data);
var mssg_data = jsonDecode(response.body);
print("DATA: $mssg_data");
}
}
只要应用程序的 http 客户端在调用相应的 Rest 服务之前拒绝调用,您就会遇到握手异常。 默认情况下,flutter 的 http 客户端会拒绝尝试与安全证书已过期或未经验证的服务进行通信的调用。
您可以使用以下代码示例覆盖默认的 http 客户端,并使其向具有无效证书的 Rest 服务发送请求:
void main() {
HttpOverrides.global = MyHttpOverrides();
runApp(MyApp());
}
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
另外,如果问题仍然存在,我们应该进一步调查一下。如果您使用模拟器,应用程序可能无法与本地服务器通信,如果是这样,您可以按照以下线程解决它:How do you connect localhost in the Android emulator?
我刚刚随机弹出此错误消息。之前一切都工作正常...为了解决这个问题,这是从 HTTPS API 调用更改/切换到 HTTP API 调用...幸运的是,客户端也提供了 HTTP 连接...希望这会有所帮助:)
每当我在设备或模拟器上手动切换日期并忘记将其放回时,我都会遇到握手异常。我不知道这是否是您的情况的问题,但请尝试一下并检查您的日期是否正确。有时在模拟器中也需要删除它并重新创建它才能正常运行。