我刚接触 Flutter,无法弄清楚这个。
我的应用正在运行 Flutter Web。
注册页面成功地将用户插入到 MySQL 数据库中,但是,当我尝试登录(使用正确的数据)时,它只是继续加载而不导航到主页。
仅供参考 - 后端由 PHP 管理。正在 Chrome 浏览器上调试此应用。
预先感谢您的帮助。
下面的代码片段是应该在 signin.dart 中导航到家的地方
if (response.statusCode == 200) {
Map<String, dynamic> resposne = jsonDecode(response.body);
if (!resposne['error']) {
Map<String, dynamic> user = resposne['data'];
print(" User name ${user['id']}");
savePref(1, user['name'], user['email'], user['id']);
Navigator.pushReplacementNamed(context, "/home");
} else {
print(" ${resposne['message']}");
}
Signin.dart
import 'dart:convert';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:rest_app/apis/api.dart';
import 'package:rest_app/screens/signup.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'home.dart';
class SignIn extends StatefulWidget {
@override
_SignInState createState() => _SignInState();
}
class _SignInState extends State<SignIn> {
final _formKey = GlobalKey<FormState>();
String email, password;
bool isLoading = false;
TextEditingController _emailController = new TextEditingController();
TextEditingController _passwordController = new TextEditingController();
GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
body: SingleChildScrollView(
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Stack(
children: <Widget>[
Container(
width: double.infinity,
height: double.infinity,
child: Image.asset(
"assets/background.jpg",
fit: BoxFit.fill,
),
),
Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(
child: Image.asset(
"assets/logo.png",
height: 30,
width: 30,
alignment: Alignment.center,
)),
SizedBox(
height: 13,
),
Text(
"Learn With Us",
style: GoogleFonts.roboto(
textStyle: TextStyle(
fontSize: 27,
color: Colors.white,
letterSpacing: 1)),
),
SizedBox(
height: 5,
),
Container(
width: 180,
child: Text(
"RRTutors, Hyderabad",
textAlign: TextAlign.center,
style: GoogleFonts.roboto(
textStyle: TextStyle(
color: Colors.white54,
letterSpacing: 0.6,
fontSize: 11),
),
),
),
SizedBox(
height: 40,
),
Text(
"Sign In",
textAlign: TextAlign.center,
style: GoogleFonts.roboto(
textStyle: TextStyle(
color: Colors.white,
letterSpacing: 1,
fontSize: 23,
),
),
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"Learn new Technologies ?",
textAlign: TextAlign.center,
style: GoogleFonts.roboto(
textStyle: TextStyle(
color: Colors.white70,
letterSpacing: 1,
fontSize: 17,
),
),
),
],
),
SizedBox(
height: 30,
),
Form(
key: _formKey,
child: Container(
margin: EdgeInsets.symmetric(
vertical: 10, horizontal: 45),
child: Column(
children: <Widget>[
TextFormField(
style: TextStyle(
color: Colors.white,
),
controller: _emailController,
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.white)),
hintText: "Email",
hintStyle: TextStyle(
color: Colors.white70, fontSize: 15),
),
onSaved: (val) {
email = val;
},
),
SizedBox(
height: 16,
),
TextFormField(
style: TextStyle(
color: Colors.white,
),
controller: _passwordController,
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.white)),
hintText: "Password",
hintStyle: TextStyle(
color: Colors.white70, fontSize: 15),
),
onSaved: (val) {
email = val;
},
),
SizedBox(
height: 30,
),
Stack(
children: [
GestureDetector(
onTap: () {
if (isLoading) {
return;
}
if (_emailController.text.isEmpty ||
_passwordController.text.isEmpty) {
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text(
"Please Fill all fileds")));
return;
}
login(_emailController.text,
_passwordController.text);
setState(() {
isLoading = true;
});
//Navigator.pushReplacementNamed(context, "/home");
},
child: Container(
alignment: Alignment.center,
width: double.infinity,
padding: EdgeInsets.symmetric(
vertical: 10, horizontal: 0),
height: 50,
decoration: BoxDecoration(
border: Border.all(color: Colors.white),
borderRadius: BorderRadius.circular(50),
),
child: Text(
"SUBMIT",
textAlign: TextAlign.center,
style: GoogleFonts.roboto(
textStyle: TextStyle(
color: Colors.white,
fontSize: 16,
letterSpacing: 1)),
),
),
),
Positioned(
child: (isLoading)
? Center(
child: Container(
height: 26,
width: 26,
child:
CircularProgressIndicator(
backgroundColor: Colors.green,
)))
: Container(),
right: 30,
bottom: 0,
top: 0,
)
],
)
],
),
),
),
SizedBox(
height: 20,
),
Text(
"OR",
style: TextStyle(fontSize: 14, color: Colors.white60),
),
SizedBox(
height: 20,
),
Image.asset(
"assets/fingerprint.png",
height: 36,
width: 36,
),
SizedBox(
height: 30,
),
GestureDetector(
onTap: () {
Navigator.pushReplacementNamed(context, "/signup");
},
child: Text(
"Don't have an account?",
style: GoogleFonts.roboto(
textStyle: TextStyle(
color: Colors.white70,
fontSize: 13,
decoration: TextDecoration.underline,
letterSpacing: 0.5)),
),
)
],
),
),
],
),
),
));
}
login(email, password) async {
Map data = {'email': email, 'password': password};
print(data.toString());
final response = await http.post(LOGIN,
headers: {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"
},
body: data,
encoding: Encoding.getByName("utf-8"));
setState(() {
isLoading = false;
});
if (response.statusCode == 200) {
Map<String, dynamic> resposne = jsonDecode(response.body);
if (!resposne['error']) {
Map<String, dynamic> user = resposne['data'];
print(" User name ${user['id']}");
savePref(1, user['name'], user['email'], user['id']);
Navigator.pushReplacementNamed(context, "/home");
} else {
print(" ${resposne['message']}");
}
_scaffoldKey.currentState
.showSnackBar(SnackBar(content: Text("${resposne['message']}")));
} else {
_scaffoldKey.currentState
.showSnackBar(SnackBar(content: Text("Please try again!")));
}
}
savePref(int value, String name, String email, int id) async {
SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.setInt("value", value);
preferences.setString("name", name);
preferences.setString("email", email);
preferences.setString("id", id.toString());
preferences.commit();
}
}
日志
Running with unsound null safety
For more information see https://dart.dev/null-safety/unsound-null-safety
Debug service listening on ws://127.0.0.1:60476/FtYO7LqYdYw=/ws
{email: test@gmail.com, password: password}
Error: XMLHttpRequest error.
dart-sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart 906:28 get current
packages/http/src/browser_client.dart 84:22 <fn>
dart-sdk/lib/async/zone.dart 1612:54 runUnary
dart-sdk/lib/async/future_impl.dart 152:18 handleValue
dart-sdk/lib/async/future_impl.dart 704:44 handleValueCallback
dart-sdk/lib/async/future_impl.dart 733:13 _propagateToListeners
dart-sdk/lib/async/future_impl.dart 530:7 [_complete]
dart-sdk/lib/async/stream_pipe.dart 61:11 _cancelAndValue
dart-sdk/lib/async/stream.dart 1219:7 <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 324:14 _checkAndCall
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 329:39 dcall
dart-sdk/lib/html/dart2js/html_dart2js.dart 37307:58 <fn>
at Object.createErrorWithStack (http://localhost:60442/dart_sdk.js:5348:12)
at Object._rethrow (http://localhost:60442/dart_sdk.js:39350:16)
at async._AsyncCallbackEntry.new.callback (http://localhost:60442/dart_sdk.js:39344:13)
at Object._microtaskLoop (http://localhost:60442/dart_sdk.js:39176:13)
at _startMicrotaskLoop (http://localhost:60442/dart_sdk.js:39182:13)
at http://localhost:60442/dart_sdk.js:34689:9
答案 0 :(得分:1)
错误中的这一行很重要:
Error: XMLHttpRequest error.
这意味着 HTTP 请求失败,甚至在导航代码执行之前就抛出异常。
建议在 Web 以外的平台上进行调试,因为您可以使用有状态的热重载并在跟踪中获取行号,这会使这个问题更加清晰。