草庐IT

dart - setter 'msg=' 在 null 上被调用

coder 2023-07-23 原文

我正在使用 flutter 向 api 发送请求,并将响应值保存在我的一个模型的实例中。但我收到一些奇怪的错误。您可以在下面看到我的代码和错误。我正在使用 scoped_model 进行状态管理。

import 'dart:convert';
import 'dart:async';
import 'dart:io';

import 'package:shared_preferences/shared_preferences.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:http/http.dart' as http;
import 'package:rxdart/subjects.dart';


class Patient {
  final String guid;
  final String phone;
  final String token;
  final String name;
  final String lastName;

  Patient({@required this.guid, @required this.phone, @required this.token , @required this.name , @required this.lastName });
}

class RTN {
   String msg = '';
   String success = 'false';
   String guid ='';
   String srcPath ='';
   String thumbPath ='';
   dynamic obj ='';

  RTN(
      {@required this.msg,
      @required this.guid,
      @required this.obj,
      @required this.srcPath,
      @required this.success,
      @required this.thumbPath});
}



class MainModel extends Model with Connected, PatientModel, UtilityModel {
}

mixin Connected on Model {
  List<Doctor> _doctor = [];
  Patient _authenticatedPatient;
  bool _isLoading = false;
  RTN _rtn;
  RTN get rtn{
    return _rtn;
  }

  List<Doctor> get allDrs {
    return List.from(_doctor);
  }
}

mixin PatientModel on Connected {
  PublishSubject<bool> _patientSubject = PublishSubject();

  Patient get patient {
    return _authenticatedPatient;
  }

  PublishSubject<bool> get patientSubject {
    return _patientSubject;
  }

  Future<Map<String, dynamic>> authenticateFirst(String phone) async {
    try{
    _isLoading = true;
    notifyListeners();
    final Map<String, dynamic> authFirstData = {
      'Phone': phone,
    };
    http.Response response;
    response = await http.post(
      'http://guffy.ir/Auth/RegisterOne',
      body: json.encode(authFirstData),
      headers: {'Content-Type': 'application/json'},
    );

    final Map<String, dynamic> responseData = json.decode(response.body);
    print(responseData);
    bool hasError = true;
    String message = '';
    print(responseData);
    if (responseData.containsKey("guid")) {
       hasError = false;
      rtn.msg = responseData["msg"];
      rtn.guid = responseData["guid"];
      rtn.obj = responseData["obj"];
      rtn.srcPath = responseData["srcPath"];
      rtn.success = responseData["success"];
      rtn.thumbPath = responseData["thumbPath"];
      message = rtn.msg;
      _authenticatedPatient = Patient(
        guid: responseData["guid"],
        phone: phone,
        token: null,
        name: null,
        lastName: null,
      );
      // _patientSubject.add(true);
      final SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setString('token', '');
      prefs.setString('patientPhone', phone);
      prefs.setString('patientGuid', responseData['guid']);
      prefs.setString('name', '');
      prefs.setString('lastName', '');
    }
    _isLoading = false;
    notifyListeners();
    return {'success': !hasError, 'message': message};
  }
  catch(error){
    _isLoading = false;
    print(error);
  }}
  Future<Map<String, dynamic>> authenticateSecond(String phone) async {
    _isLoading = true;
    notifyListeners();
    final Map<String, dynamic> authFirstData = {
      'Phone': phone,
    };
    http.Response response;
    response = await http.post(
      'http://guffy.ir/Auth/RegisterOne',
      body: json.encode(authFirstData),
      headers: {'Content-Type': 'application/json'},
    );

    final Map<String, dynamic> responseData = json.decode(response.body);
    print(responseData);
    bool hasError = true;
    String message = '';
    print(responseData);
    if (responseData.containsKey('guid')) {
      hasError = false;
      message = responseData['msg'];
      _authenticatedPatient = Patient(
        guid: responseData['guid'],
        phone: phone,
        token: null,
        name: null,
        lastName: null,
      );
      // _patientSubject.add(true);
      final SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setString('token', null);
      prefs.setString('patientPhone', phone);
      prefs.setString('patientGuid', responseData['guid']);
      prefs.setString('name', null);
      prefs.setString('lastName', null);
    }
    _isLoading = false;
    notifyListeners();
    return {'success': !hasError, 'message': message};
  }
    Future<Map<String, dynamic>> authenticateThird(String phone) async {
    _isLoading = true;
    notifyListeners();
    final Map<String, dynamic> authThirdData = {
      'Phone': phone,
    };
    http.Response response;
    response = await http.post(
      'http://guffy.ir/Auth/RegisterOne',
      body: json.encode(authThirdData),
      headers: {'Content-Type': 'application/json'},
    );

    final Map<String, dynamic> responseData = json.decode(response.body);
    print(responseData);
    bool hasError = true;
    String message = '';
    print(responseData);
    if (responseData.containsKey('guid')) {
      hasError = false;
      message = responseData['msg'];
      _authenticatedPatient = Patient(
        guid: responseData['guid'],
        phone: phone,
        token: null,
        name: null,
        lastName: null,
      );
      _patientSubject.add(true);
      final SharedPreferences prefs = await SharedPreferences.getInstance();
      prefs.setString('token', null);
      prefs.setString('patientPhone', phone);
      prefs.setString('patientGuid', responseData['guid']);
      prefs.setString('name', null);
      prefs.setString('lastName', null);
    }
    _isLoading = false;
    notifyListeners();
    return {'success': !hasError, 'message': message};
  }
  void autoAuthenticate() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    final String name = prefs.getString('name');
    final String lastName = prefs.getString('lastName');
    if (name != '' && lastName != '') {
      final String patientPhone = prefs.getString('patientPhone');
      final String patientGuid = prefs.getString('patientGuid');
      final String token = prefs.getString('token');
      _authenticatedPatient =
          Patient(guid: patientGuid, phone: patientPhone, token: token , name: name , lastName: lastName);
      _patientSubject.add(true);
      notifyListeners();
    }
  }

  void logout() async {
    _authenticatedPatient = null;
    _patientSubject.add(false);
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.remove('token');
    prefs.remove('PatientEmail');
    prefs.remove('PatientId');
  }
}
mixin UtilityModel on Connected {
  bool get isLoading {
    return _isLoading;
  }
}

这是我从 api 得到的响应:

{msg: کد ارسال شد, success: true, guid: 15dde915-d752-4bf1-90ad-49872868af35, srcPath: null, thumbPath: null, obj: null}

这是我遇到的错误:

I/flutter (10151): NoSuchMethodError: The setter 'msg=' was called on null.
I/flutter (10151): Receiver: null
I/flutter (10151): Tried calling: msg="کد ارسال شد"
E/flutter (10151): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter (10151): NoSuchMethodError: The method '[]' was called on null.
E/flutter (10151): Receiver: null
E/flutter (10151): Tried calling: []("success")
E/flutter (10151): #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
E/flutter (10151): #1      _AuthOnePageState._submitForm (package:restt/pages/authone.dart:93:27)
E/flutter (10151): <asynchronous suspension>

最佳答案

错误是说您试图访问空对象上的字段 msg,这可能是这一行:

rtn.msg = responseData["msg"];

你只需要在使用之前实例化对象:

RTN _rtx;
RTN get rtn {
    if (_rtn == null) {
        _rtx = RTN(); // Instantiate the object if its null.
    }
    return _rtn;
}

关于dart - setter 'msg=' 在 null 上被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380018/

有关dart - setter 'msg=' 在 null 上被调用的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  8. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  9. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  10. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

随机推荐