- 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/
我找到了 this excellent question and answer它以 x/y(加上 center x/y 和 degrees/radians)开始并计算旋转- 到 x'/y'。这个计算很
全部: 我已经创建了一个 Windows 窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但是如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何 Windows 窗体控件属
本网站的另一个问题已证实,C 中没有缩写的字面后缀,并且可以执行以下操作: short Number = (short)1; 但是转换它和不这样做有什么区别: short Number = 1; 您使
我有下表: ID (int) EMAIL (varchar(50)) CAMPAIGNID (int) isSubscribe (bit) isActionByUser (bit) 此表存储了用户对事
也就是说,无需触发Javascript事件即可改变的属性,如何保留我手动选中或取消选中的复选框的状态,然后复制到另一个地方? 运行下面的代码片段并选中或取消选中其中的一些,然后点击“复制”: $('#
我在网上找到的所有关于递增指针导致段错误的示例都涉及指针的取消引用 - 如果我只想递增它(例如在 for 循环的末尾)并且我不在乎它是否最终进入无效内存,因为我不会再使用它。例如,在这个程序中,每次迭
我有一个 Spring MVC REST 服务,它使用 XStream 将消息与 XML 相互转换。 有什么方法可以将请求和响应中的 xml(即正文)打印到普通的 log4j 记录器? 在 Contr
做我的任务有一个很大的挑战,那就是做相互依赖的任务我在这张照片中说的。假设我们有两个任务 A 和 B,执行子任务 A1、A2 和 B1、B2,假设任务 B 依赖于 A。 要理想地执行任务 B,您应该执
通过阅读该网站上的几个答案,我了解到 CoInitialize(Ex) should be called by the creator of a thread 。然后,在该线程中运行的任何代码都可以使
这个问题已经困扰我一段时间了。我以前从未真正使用过 ListViews,也没有使用过 FirebaseListAdapters。我想做的就是通过显示 id 和用户位置来启动列表的基础,但由于某种原因,
我很难解释这两个(看似简单)句子的含义: “受检异常由编译器在编译时检查” 这是什么意思?编译器检查是否捕获了所有已检查的异常(在代码中抛出)? “未经检查的异常在运行时检查,而不是编译时” 这句话中
我有一个包含排除子字符串的文本文件,我想迭代该文件以检查并返回不带排除子字符串的输入项。 这里我使用 python 2.4,因此下面的代码可以实现此目的,因为 with open 和 any 不起作用
Spring 的缓存框架能否了解请求上下文的身份验证状态,或者更容易推出自己的缓存解决方案? 最佳答案 尽管我发现这个用例 super 奇怪,但您可以为几乎任何与 SpEL 配合使用的内容设置缓存条件
我有以下函数模板: template HeldAs* duplicate(MostDerived *original, HeldAs *held) { // error checking omi
如果我的应用程序具有设备管理员/设备所有者权限(未获得 root 权限),我如何才能从我的应用程序中终止(或阻止启动)另一个应用程序? 最佳答案 设备所有者可以阻止应用程序: DevicePolicy
非常简单的问题,但我似乎无法让它正常工作。 我有一个组件,其中有一些 XSLT(用于导航)。它通过 XSLT TBB 使用 XSLT Mediator 发布。 发布后
我正在将一个对象拖动到一个可拖放的对象内,该对象也是可拖动的。放置对象后,它会嵌套在可放置对象内。同样,如果我将对象拖到可放置的外部,它就不再嵌套。 但是,如果我经常拖入和拖出可放置对象,则可拖动对象
我正在尝试为按钮和弹出窗口等多个指令实现“取消选择”功能。也就是说,我希望当用户单击不属于指令模板一部分的元素时触发我的函数。目前,我正在使用以下 JQuery 代码: $('body').click
我从 this question 得到了下面的代码,该脚本用于在 Google tasks 上更改 iframe[src="about:blank"] 内的 CSS使用 Chrome 扩展 Tempe
我有一些 @Mock 对象,但没有指定在该对象上调用方法的返回值。该方法返回 int (不是 Integer)。我很惊讶地发现 Mockito 没有抛出 NPE 并返回 0。这是预期的行为吗? 例如:
我是一名优秀的程序员,十分优秀!