屏幕登录后未加载的屏幕在颤动中进行身份验证



我已经创建了通往主屏幕的路由,该路由在登录成功后应显示。但是,我的圆形条只是不断移动(表示载荷阶段(,并且主屏幕不会显示在模拟器中。

我知道登录成功是成功的,因为我的响应变量确实在登录后访问的控制台中打印了信息。

按登录时显示按钮2主要问题:1(处理手势时的例外2(未经手的例外:失败的断言:布尔表达不得无效

我无法解决这两个问题。任何帮助都会很棒。预先感谢!

没有汇编错误。以下是按下登录按钮后显示的主要问题(稍后在问题中发布的堆栈树和消息(:

flutter: The following ArgumentError was thrown while handling a       gesture:
flutter: Invalid argument (onError): Error handler must accept one     Object or one Object and a StackTrace as
flutter: arguments, and return a a valid result: Closure: (Exception) => void
Unhandled Exception: Failed assertion: boolean expression must not be null

稍后发布的控制台消息是指3个文件。我已经发布了以下文件的重要代码。

文件:login_screen.dart

import 'dart:ui';
import 'package:flutter/material.dart';

class LoginScreen extends StatefulWidget {
    @override
    State<StatefulWidget> createState() {
    return new LoginScreenState();
  }
}
class LoginScreenState extends State<LoginScreen>
    implements LoginScreenContract, AuthStateListener {
  BuildContext _ctx;
  bool _isLoading = false;
  final formKey = new GlobalKey<FormState>();
  final scaffoldKey = new GlobalKey<ScaffoldState>();
  String _password, _username;
  LoginScreenPresenter _presenter;
  LoginScreenState() {
    _presenter = new LoginScreenPresenter(this);
     var authStateProvider = new AuthStateProvider();
    authStateProvider.subscribe(this);
  }
  void _submit() {
    final form = formKey.currentState;
    if (form.validate()) {
      setState(() => _isLoading = true);
      form.save();
      _presenter.doLogin(_username, _password);
    }
  }
  void _showSnackBar(String text) {
    scaffoldKey.currentState
        .showSnackBar(new SnackBar(content: new Text(text)));
  }
  @override
  onAuthStateChanged(AuthState state) {
    if(state == AuthState.LOGGED_IN)
      Navigator.of(_ctx).pushReplacementNamed("/home");
  }
  @override
   Widget build(BuildContext context) {
    _ctx = context;
    ....(UI for login screen)
  @override
  void onLoginError(String errorTxt) {
    _showSnackBar(errorTxt);
    setState(() => _isLoading = false);
  }
   @override
   void onLoginSuccess(User user) async {
   HomeScreen()));
    _showSnackBar(user.toString());
    setState(() => _isLoading = false);
    var db = new DatabaseHelper();
    await db.saveUser(user);
    var authStateProvider = new AuthStateProvider();
    HomeScreen()));
    authStateProvider.notify(AuthState.LOGGED_IN);
    onAuthStateChanged(AuthState.LOGGED_IN);
  }
}

文件:login_screen_presenter.dart

import 'package:better_login/rest_ds.dart';
import 'package:better_login/user.dart';
abstract class LoginScreenContract {
  void onLoginSuccess(User user);
  void onLoginError(String errorTxt);
}
 class LoginScreenPresenter {
  LoginScreenContract _view;
  RestDatasource api = new RestDatasource();
  LoginScreenPresenter(this._view);
  doLogin(String username, String password) {
    api.login(username, password).then((User user) {
      _view.onLoginSuccess(user);
     }).catchError((Exception error) =>
        _view.onLoginError(error.toString()));
  }
}

文件:REST_DS.DART

 static final LOGIN_URL = "https://legacy-  api.example.com/v1/auth/login";

   Future<User> login(String username, String password) {
     return _netUtil.post(LOGIN_URL, body: {
       "username": username,
       "password": password
    }).then((dynamic res) {
      print(res.toString());
       if(res["error"]){ throw new Exception(res["error_msg"]);}
       return new User.map(res["user"]);
    });
  }

}

这是控制台中显示的完整信息:

flutter: The following ArgumentError was thrown while handling a gesture:
flutter: Invalid argument (onError): Error handler must accept one Object or one Object and a StackTrace as
flutter: arguments, and return a a valid result: Closure: (Exception) => void
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #2      LoginScreenPresenter.doLogin   (package:better_login/login_screen_presenter.dart:17:8)
flutter: #3      LoginScreenState._submit (package:better_login/login_screen.dart:41:18)
flutter: #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:511:14)
flutter: #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:566:30)
flutter: #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)
flutter: #7      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:240:9)
flutter: #8      TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:177:9)
flutter: #9      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:436:9)
flutter: #10     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
flutter: #11     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
flutter: #12        _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:221:19)
flutter: #13     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:199:22)
flutter: #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
flutter: #15     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
flutter: #16     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
flutter: #20     _invoke1 (dart:ui/hooks.dart:233:10)
flutter: #21     _dispatchPointerDataPacket (dart:ui/hooks.dart:154:5)
flutter: (elided 5 frames from package dart:async)
flutter:
flutter: Handler: onTap
flutter: Recognizer:
flutter:   TapGestureRecognizer#398b8(debugOwner: GestureDetector,   state: possible, won arena, finalPosition:
flutter:   Offset(194.0, 504.0), sent tap down)
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
flutter: {status: success, message: Authentication Success,   executionTime: 0.052, data: {token:    U2FsdGVkX19ZQS5wQXRYWTkh2o4PyrtmhS4kELJO0WsEBDbn30G9Oig/13fzHzqZ,   custKey: anb2mNXFERnJ4IQW....(rest is info got on login)
[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Failed   assertion:  boolean expression must not be null
#0      RestDatasource.login.<anonymous closure>   (package:better_login/rest_ds.dart:21:13)
#1      _rootRunUnary (dart:async/zone.dart:1132:38)
#2      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#3      _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
#4      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
#5      Future._propagateToListeners (dart:async/future_impl.dart:668:32)
#6      Future._complete (dart:async/future_impl.dart:473:7)
#7      _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#8      _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
#9      _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
#10     _withClient (package:http/http.dart)
<asynchronous suspension>
#11     post (package:http/http.dart:69:5)
#12     NetworkUtil.post (package:better_login/network_util.dart<…>

您的代码中有几个问题:

  • catchError参数不是类型Exception的类型Object。您可以使用catchErrortest的第二个参数来过滤收到的错误。这是崩溃报告的原因跟踪The following ArgumentError was thrown while handling a gestur

  • 崩溃的主要原因在这里if(res["error"]){ throw new Exception(res["error_msg"]);},因为res["error"]可能为null。要修复它,将其更改为if(res["error"] != null) ....

重构点:

  • 您不需要将构建上下文保存在_ctx变量中,State的任何子类都可以通过context属性访问其主要context

相关内容