簡體   English   中英

Flutter:未處理的異常:失敗的斷言:布爾表達式不能為空

[英]Flutter: unhandled Exception: Failed assertion: boolean expression must not be null

我在從flutter登錄到laravel api時遇到了這個問題。 我使用了以下代碼並收到錯誤消息:

Unhandled Exception: Failed assertion: boolean expression must not be null.

登錄.購物車代碼

```
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 代碼``` import 'package:http/http.dart' as http; 導入“飛鏢:轉換”; 導入 'package:shared_preferences/shared_preferences.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):

等待回應。 謝謝

我認為您正在傳遞 value = 0 但檢查 value = '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(),
      ));
    }
  }

您必須將他的 Bool 值分配給 DatabaseHelper Status

改變

if (databaseHelper.status)

if (databaseHelper.status == true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM