- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从flutter登录到laravel API时遇到问题。我已经使用下面的代码并收到错误消息:
Unhandled Exception: Failed assertion: boolean expression must not be null.
login.cart代码
```
import 'package:flutter/material.dart';
import 'package:qtrack/api/api.dart';
import 'package:qtrack/Pages/Dashboard/dashboard.dart';
import 'package:qtrack/Pages/Register/register.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LoginPage extends StatefulWidget {
LoginPage({Key key, this.title}) : super(key: key);
final String title;
@override
LoginPageState createState() => LoginPageState();
}
class LoginPageState extends State<LoginPage> {
DatabaseHelper databaseHelper = new DatabaseHelper();
String msgStatus = '';
final TextEditingController _emailController = new TextEditingController();
final TextEditingController _passwordController = new TextEditingController();
@override
initState() {
read();
super.initState();
}
read() async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
if (value != '0') {
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => new Dashboard(),
));
}
}
_onPressed() {
setState(() {
if ((_emailController.text).trim().toLowerCase().isNotEmpty &&
((_passwordController.text).trim().isNotEmpty)) {
databaseHelper
.loginData(_emailController.text.trim().toLowerCase(),
_passwordController.text.trim())
.whenComplete(() {
if (databaseHelper.status) {
Navigator.pushReplacementNamed(context, '/dashboard');
} else {
_showDialog();
msgStatus = 'Check email or password';
}
});
}
});
}
void _showDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: new Text('Failed'),
content: new Text('Check your email or password'),
actions: <Widget>[
new RaisedButton(
child: new Text(
'Close',
),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Stack(
children: <Widget>[
/////////// background///////////
new Container(
decoration: new BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
stops: [0.0, 0.4, 0.9],
colors: [
Color(0xFFFF835F),
Color(0xFFFC663C),
Color(0xFFFF3F1A),
],
),
),
),
Positioned(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Card(
elevation: 4.0,
color: Colors.white,
margin: EdgeInsets.only(left: 20, right: 20),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15)),
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
///////////// Email//////////////
TextField(
style: TextStyle(color: Color(0xFF000000)),
controller: _emailController,
cursorColor: Color(0xFF9b9b9b),
keyboardType: TextInputType.text,
decoration: InputDecoration(
prefixIcon: Icon(
Icons.account_circle,
color: Colors.grey,
),
hintText: "Email",
hintStyle: TextStyle(
color: Color(0xFF9b9b9b),
fontSize: 15,
fontWeight: FontWeight.normal),
),
),
/////////////// password////////////////////
TextField(
style: TextStyle(color: Color(0xFF000000)),
cursorColor: Color(0xFF9b9b9b),
controller: _passwordController,
keyboardType: TextInputType.text,
obscureText: true,
decoration: InputDecoration(
prefixIcon: Icon(
Icons.vpn_key,
color: Colors.grey,
),
hintText: "Password",
hintStyle: TextStyle(
color: Color(0xFF9b9b9b),
fontSize: 15,
fontWeight: FontWeight.normal),
),
),
///////////// LogIn Botton///////////////////
Padding(
padding: const EdgeInsets.all(10.0),
child: FlatButton(
child: Padding(
padding: EdgeInsets.only(
top: 8, bottom: 8, left: 10, right: 10),
child: Text(
'Login',
textDirection: TextDirection.ltr,
style: TextStyle(
color: Colors.white,
fontSize: 15.0,
decoration: TextDecoration.none,
fontWeight: FontWeight.normal,
),
),
),
color: Color(0xFFFF835F),
disabledColor: Colors.grey,
shape: new RoundedRectangleBorder(
borderRadius:
new BorderRadius.circular(20.0)),
onPressed: _onPressed,
),
),
],
),
),
),
//////////// new account///////////////
Padding(
padding: const EdgeInsets.only(top: 20),
child: InkWell(
onTap: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => RegisterPage()));
},
child: Text(
'Create new Account',
textDirection: TextDirection.ltr,
style: TextStyle(
color: Colors.white,
fontSize: 15.0,
decoration: TextDecoration.none,
fontWeight: FontWeight.normal,
),
),
),
),
],
),
),
)
],
),
),
);
}
}
```
api.dart代码
class DatabaseHelper {
String serverUrl = "http://localhost/qtrack-api/public/api";
var status;
var token;
loginData(String email, String password) async {
String myUrl = "$serverUrl/login";
final response = await http.post(myUrl,
headers: {'Accept': 'application/json'},
body: {"email": "$email", "password": "$password"});
status = response.body.contains('success');
var data = json.decode(response.body);
if (status) {
_save(data["token"]);
} else {
print('data : ${data["error"]}');
}
}
registerData(String name, String email, String password) async {
String myUrl = "$serverUrl/register";
final response = await http.post(myUrl,
headers: {'Accept': 'application/json'},
body: {"name": "$name", "email": "$email", "password": "$password"});
status = response.body.contains('error');
var data = json.decode(response.body);
if (status) {
print('data : ${data["error"]}');
} else {
print('data : ${data["token"]}');
_save(data["token"]);
}
}
Future<List> getData() async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
String myUrl = "$serverUrl/products/";
http.Response response = await http.get(myUrl, headers: {
'Accept': 'application/json',
'Authorization': 'Bearer $value'
});
return json.decode(response.body);
}
void deleteData(int id) async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
String myUrl = "$serverUrl/products/$id";
http.delete(myUrl, headers: {
'Accept': 'application/json',
'Authorization': 'Bearer $value'
}).then((response) {
print('Response status : ${response.statusCode}');
print('Response body : ${response.body}');
});
}
void addData(String name, String price) async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
String myUrl = "$serverUrl/products";
http.post(myUrl, headers: {
'Accept': 'application/json',
'Authorization': 'Bearer $value'
}, body: {
"name": "$name",
"price": "$price"
}).then((response) {
print('Response status : ${response.statusCode}');
print('Response body : ${response.body}');
});
}
void editData(int id, String name, String price) async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
String myUrl = "http://flutterapitutorial.codeforiraq.org/api/products/$id";
http.put(myUrl, headers: {
'Accept': 'application/json',
'Authorization': 'Bearer $value'
}, body: {
"name": "$name",
"price": "$price"
}).then((response) {
print('Response status : ${response.statusCode}');
print('Response body : ${response.body}');
});
}
_save(String token) async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = token;
prefs.setString(key, value);
}
read() async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
print('read : $value');
}
}
```
Dubug控制台日志
E/flutter ( 8339): [ERROR:flutter/lib/ui/ui_dart_state.cc(171)] Unhandled Exception: Failed assertion: boolean expression must not be null
E/flutter ( 8339): #0 LoginPageState._onPressed.<anonymous closure>.<anonymous closure>
package:qtrack/…/Login/login.dart:48
E/flutter ( 8339): #1 _rootRun (dart:async/zone.dart:1182:47)
E/flutter ( 8339): #2 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 8339): #3 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:167:18)
E/flutter ( 8339): #4 Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:666:39)
E/flutter ( 8339): #5 Future._propagateToListeners (dart:async/future_impl.dart:722:37)
E/flutter ( 8339): #6 Future._completeError (dart:async/future_impl.dart:537:5)
E/flutter ( 8339): #7 _AsyncAwaitCompleter.completeError (dart:async-patch/async_patch.dart:47:15)
E/flutter ( 8339): #8 DatabaseHelper.loginData (package:qtrack/api/api.dart)
E/flutter ( 8339): <asynchronous suspension>
E/flutter ( 8339): #9 LoginPageState._onPressed.<anonymous closure>
package:qtrack/…/Login/login.dart:45
E/flutter ( 8339): #10 State.setState
package:flutter/…/widgets/framework.dart:1244
E/flutter ( 8339): #11 LoginPageState._onPressed
package:qtrack/…/Login/login.dart:41
E/flutter ( 8339): #12 _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:993
E/flutter ( 8339): #13 _InkResponseState.build.<anonymous closure>
package:flutter/…/material/ink_well.dart:1111
E/flutter ( 8339): #14 GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:183
E/flutter ( 8339): #15 TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:598
E/flutter ( 8339): #16 BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:287
E/flutter ( 8339): #17 BaseTapGestureRecognizer.handlePrimaryPointer
package:flutter/…/gestures/tap.dart:222
E/flutter ( 8339): #18 PrimaryPointerGestureRecognizer.handleEvent
package:flutter/…/gestures/recognizer.dart:476
E/flutter ( 8339): #19 PointerRouter._dispatch
package:flutter/…/gestures/pointer_router.dart:77
E/flutter ( 8339): #20 PointerRouter._dispatchEventToRoutes.<anonymous closure>
package:flutter/…/gestures/pointer_router.dart:122
E/flutter ( 8339): #21 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 8339): #22 PointerRouter._dispatchEventToRoutes
package:flutter/…/gestures/pointer_router.dart:120
E/flutter ( 8339): #23 PointerRouter.route
package:flutter/…/gestures/pointer_router.dart:106
E/flutter ( 8339): #24 GestureBinding.handleEvent
package:flutter/…/gestures/binding.dart:219
E/flutter ( 8339): #25 GestureBinding.dispatchEvent
package:flutter/…/gestures/binding.dart:199
E/flutter ( 8339): #26 GestureBinding._handlePointerEvent
package:flutter/…/gestures/binding.dart:157
E/flutter ( 8339): #27 GestureBinding._flushPointerEventQueue
package:flutter/…/gestures/binding.dart:103
E/flutter ( 8339): #28 GestureBinding._handlePointerDataPacket
package:flutter/…/gestures/binding.dart:87
E/flutter ( 8339): #29 _rootRunUnary (dart:async/zone.dart:1206:13)
E/flutter ( 8339): #30 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
E/flutter ( 8339): #31 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
E/flutter ( 8339): #32 _invoke1 (dart:ui/hooks.dart:267:10)
E/flutter ( 8339): #33 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
E/flutter ( 8339):
等待回应。
最佳答案
我认为您正在传递值= 0但正在检查值='0'
read() async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
if (value != '0') {
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => new Dashboard(),
));
}
}
关于android - Flutter:未处理的异常:断言失败: bool 表达式不能为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63545340/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!