Flutter & Fluwx问题记录 - wrong number of arguments (given 2, expected 1) (ArgumentError)

我不是女神ヾ 2024-05-24 21:39 174阅读 0赞

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
  • 解决方案
  • 补充内容1
  • 补充内容2
  • 最后

前言

最近对一个Flutter项目升级了一波依赖库版本,在开发的电脑上测试没问题后提交改动,结果到打包机打新包时遇到问题报错了。

开发环境

  • Flutter: 3.10.5
  • Dart: 3.0.5
  • Fluwx: 4.2.6

问题描述

报错信息:

  1. /xxx/plist-3.6.0/lib/plist/parser.rb:29:in `parse_xml': wrong number of arguments (given 2, expected 1) (ArgumentError)
  2. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:72:in `block (2 levels) in <main>'
  3. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:63:in `each'
  4. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:63:in `block in <main>'
  5. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:50:in `each'
  6. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:50:in `<main>'

问题分析

从报错信息看,问题出在parse_xml方法,这个方法只接受一个入参,但是现在却给了两个。找到报错的具体位置(/xxx/fluwx-4.2.6/ios/wechat_setup.rb:72):

screenshot1

Fluwx调用解析属性列表文件的方法时确实传入了两个参数,第一个是属性列表文件路径,第二个参数暂时不知道有什么作用。根据报错信息(/xxx/plist-3.6.0/lib/plist/parser.rb:29)找到parse_xml方法的定义:

  1. module Plist
  2. ...
  3. # Note that I don't use these two elements much:
  4. #
  5. # + Date elements are returned as DateTime objects.
  6. # + Data elements are implemented as Tempfiles
  7. #
  8. # Plist.parse_xml will blow up if it encounters a Date element.
  9. # If you encounter such an error, or if you have a Date element which
  10. # can't be parsed into a Time object, please create an issue
  11. # attaching your plist file at https://github.com/patsplat/plist/issues
  12. # so folks can implement the proper support.
  13. def self.parse_xml(filename_or_xml)
  14. listener = Listener.new
  15. # parser = REXML::Parsers::StreamParser.new(File.new(filename), listener)
  16. parser = StreamParser.new(filename_or_xml, listener)
  17. parser.parse
  18. listener.result
  19. end
  20. ...
  21. end

咦?️,parse_xml方法确实只接受一个入参,这是怎么回事?这个问题是在打包机上遇到的,但是在平时开发的电脑上是没问题的,在开发的电脑上找到parse_xml方法:

  1. module Plist
  2. ...
  3. # Note that I don't use these two elements much:
  4. #
  5. # + Date elements are returned as DateTime objects.
  6. # + Data elements are implemented as Tempfiles
  7. #
  8. # Plist.parse_xml will blow up if it encounters a Date element.
  9. # If you encounter such an error, or if you have a Date element which
  10. # can't be parsed into a Time object, please create an issue
  11. # attaching your plist file at https://github.com/patsplat/plist/issues
  12. # so folks can implement the proper support.
  13. #
  14. # By default, <data> will be assumed to be a marshaled Ruby object and
  15. # interpreted with <tt>Marshal.load</tt>. Pass <tt>marshal: false</tt>
  16. # to disable this behavior and return the raw binary data as an IO
  17. # object instead.
  18. def self.parse_xml(filename_or_xml, options={
  19. })
  20. listener = Listener.new(options)
  21. # parser = REXML::Parsers::StreamParser.new(File.new(filename), listener)
  22. parser = StreamParser.new(filename_or_xml, listener)
  23. parser.parse
  24. listener.result
  25. end
  26. ...
  27. end

经过对比发现,没问题的电脑上装的plist包是3.7.0版本,有问题的打包机装的plist包是3.6.0版本。从3.7.0版本开始,parse_xml方法支持了第二个参数,默认情况下该方法会将读取的文件序列化为Ruby对象并返回,而marshal: false的作用就是禁用这个默认行为,改为返回IO对象。

3.6.0版本:

  1. module Plist
  2. ...
  3. require 'base64'
  4. class PData < PTag
  5. def to_ruby
  6. data = Base64.decode64(text.gsub(/\s+/, '')) unless text.nil?
  7. begin
  8. return Marshal.load(data)
  9. rescue Exception
  10. io = StringIO.new
  11. io.write data
  12. io.rewind
  13. return io
  14. end
  15. end
  16. end
  17. end

根据源码可以看到,这个版本只有当Marshal.load方法调用出现异常,才会在处理异常时返回IO对象。

3.7.0版本:

  1. module Plist
  2. ...
  3. require 'base64'
  4. class PData < PTag
  5. def to_ruby
  6. data = Base64.decode64(text.gsub(/\s+/, '')) unless text.nil?
  7. begin
  8. return Marshal.load(data) if options[:marshal]
  9. rescue Exception
  10. end
  11. io = StringIO.new
  12. io.write data
  13. io.rewind
  14. io
  15. end
  16. end
  17. end

这个版本则加了if options[:marshal]判断,当有设置marshal: false(这时return Marshal.load(data)语句将不会执行)或Marshal.load方法调用出现异常时,返回IO对象。

参考文档:

  • Method: Plist.parse_xml— Documentation for plist (3.7.0)

解决方案

执行以下命令安装最新版本(3.7.0及以上版本)的plist包即可:

  1. gem install plist

如果要安装指定版本的plist包,可以使用以下命令:

  1. gem install plist --version [版本号]

卸载命令同理也可以指定版本号,不过一般不需要,如果有多个版本同时存在时执行gem uninstall xxx卸载命令,会出现多个选项供你选择是卸载指定某个版本还是全部版本。

补充内容1

如果遇到以下类似报错:

  1. <internal:/xxx/kernel_require.rb>:148:in `require': cannot load such file -- plist (LoadError)
  2. from <internal:/xxx/kernel_require.rb>:148:in `require'
  3. from /xxx/fluwx-4.2.6/ios/wechat_setup.rb:8:in `<main>'

这是由于未安装某个包导致的。从报错信息可知,需要安装plist包,执行以下命令安装即可解决:

  1. gem install plist

补充内容2

如果遇到以下类似报错:

  1. [!] Invalid podspec file at path `/xxx/ios/.symlinks/plugins/fluwx/ios/fluwx.podspec`.

按报错信息中的路径找到问题文件,如果里面内容缺失了,那很可能是因为第三方库没下载完整导致的报错。

解决方法:

  1. 首先在Android Studio左侧项目目录中找到[External Libraries]并展开
  2. 接着找到报错的第三方库并选中,右键选择删除。插件库在[Flutter Plugins]展开列表中查找
  3. 然后执行flutter pub get命令重新下载第三方库
  4. 最后切换到Flutter项目下的ios目录,执行pod install命令,问题一般就解决了

最后

如果这篇文章对你有所帮助,点赞?收藏?支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。

发表评论

表情:
评论列表 (有 0 条评论,174人围观)

还没有评论,来说两句吧...

相关阅读