web-dev-qa-db-ja.com

タイプ「MyClass」のデフォルトコンストラクタが見つかりません

Xamarin.formsからカスタムビューをレンダリングしようとしています。次のコードでレンダリングしようとすると

[アセンブリ:ExportRenderer(typeof(SwipeableCard)、typeof(CardContainer))]。

しかし、エラーは次のようにスローされます

タイプ 'Com.andtinde.CardContainer'のデフォルトコンストラクタが見つかりません。

カードコンテナにデフォルトのコンストラクタがないためだと思います。また、Adapterviewから継承しているため、提供できません。

私が間違っていること。どんな助けでも適用されるでしょう。

10
Tinku Chacko

これはXamarinの既知のバグだと思います。しかし、依存関係サービスでも同じ問題が発生しました。 iOSビルドオプションのリンカー動作で「LinkFrameworkSDKOnly」を設定することで解決しました。

26

あなたはすでにあなたが間違っていることを特定しました。 ExportRenderer needs実行していることを実行できるデフォルトのコンストラクター。 AdapterViewから継承すると、デフォルトのコンストラクターを使用できないのはなぜですか?

次のようなことができるはずです。

public class CardContainer
{
    public CardContainer() // This is a default constructor
        : base(...) // If base class requires arguments, pass them here
    {
    }
}
3
Steve Lillis

ViewRendererから継承し、ネイティブビュータイプとしてCardContainerを提供することをお勧めします。次に、ViewRendererのOnElementChangedメソッドをオーバーライドし、レンダラー用の新しいCardContainerを作成します。以下はあなたが始めるための短いバージョンです。

登録:

[Assembly: ExportRenderer(typeof(SwipeableCard), typeof(SwipeableCardRenderer ))]

クラス定義:

 SwipeableCardRenderer : ViewRenderer<SwipeableCard, CardContainer>

OnElementChangedオーバーライド:

if (this.Control == null)
{
    this.SetNativeControl(new CardContainer(this.Context));
}
2
SKall

これはXamarinのバグではないため、リンクされたアセンブリを管理する方法を知っておく必要があります.xamarinで動作するすべてのランタイムは、次のようなエラーを受け取ります。たとえば、アセンブリがない場合、ランタイムでクラスのパフォーマンスを取得したり、ランタイムでインスタンスを作成したりすることはできません。リンクされています。リンクされたアセンブリを手動で管理するか、アプリケーションオプションでそれらを Alessio Campanelli 回答 ここ として設定できます。手動で設定しないと、アプリケーションはリリースパッケージで大きなサイズになりますapkファイルのように。手動で設定するには?

  1. Androidアプリケーション名it "linked.xml"にxmlファイルを作成します
  2. 右クリックして「linked.xml」のperopertiesに移動し、「BuildAction」を「LinkDescription」に設定します
  3. 次のように、実行時に使用されるアセンブリを追加します。
    <?xml version="1.0" encoding="utf-8" ?>
    <linker>
      <Assembly fullname="Newtonsoft.Json">
        <type fullname="*" />
      </Assembly>
    </linker>

xamarinのリンカー

1
Ali Yousefi