Elixir Desktop 在菜单栏中存在透析器问题

Elixir Desktop has dialyzer issues in MenuBar

背景

我有一个使用 Elixir Desktop 的小应用程序。此应用运行良好,启动时没有问题:

https://github.com/Fl4m3Ph03n1x/market_manager/tree/master/apps/web_interface

但是,我有透析器抱怨类型。我不确定这是误报,还是我做错了什么。

问题

我的应用程序中有一个 MenuBar,具有一些基本功能。据我所知,这个 MenuBar 是一个 Phoenix LiveView 组件(因为它有一个 mount 和一个 render 函数)。所以对于 Phoenix 和 LiveView 的大多数用户来说,这段代码看起来应该很熟悉:

defmodule WebInterface.Live.MenuBar do
  @moduledoc """
  Menubar that is shown as part of the main Window on Windows/Linux. In
  MacOS this Menubar appears at the very top of the screen.
  """

  use Desktop.Menu

  alias Desktop.{Menu, Window}

  @impl Menu
  def render(assigns) do
    ~H"""
    <menubar>
      <menu label="File">
          <hr/>
          <item onclick="quit">Quit</item>
      </menu>
    </menubar>
    """
  end

  @impl Menu
  def handle_event("quit", menu) do
    Window.quit()
    {:noreply, menu}
  end

  @impl Menu
  def mount(menu), do: {:ok, menu}

  @impl Menu
  def handle_info(:changed, menu), do: {:noreply, menu}

end

这里的问题是 Dialyzer 抱怨我的渲染函数:

Type mismatch for @callback render/1 in Desktop.Menu behaviour.

Expected type:
binary()

Actual type:
%Phoenix.LiveView.Rendered{
  :dynamic => (_ -> []),
  :fingerprint => 15_721_876_439_225_774_806_119_511_245_371_375_581,
  :root => true,
  :static => [<<_::1480>>, ...]
}

它说它需要一个字符串而不是 H 印记。这让我感到困惑,因为最新版本 does support this sigil.

问题

那么问题来了。我做错了什么,我该如何解决?

回答

原来这是库中的错误。

随着我的 PR 被接受,修复已经在 master 中: https://github.com/elixir-desktop/desktop/issues/17