gpt4 book ai didi

xamarin.forms - 如何在 .net MAUI 或 Xamarin Forms 中使用复杂对象进行 Shell 导航?

转载 作者:行者123 更新时间:2023-12-05 05:42:01 29 4
gpt4 key购买 nike

最近我开始使用 shell,我注意到页面转换有所改进,我使用 NavigationPage 时遇到的一个错误只需将其替换为 shell 即可得到修复。

所以我很高兴能使用它。

然而,在我意识到我无法像使用页面构造函数那样通过 shell 将对象从一个页面发送到另一个页面后不久。我搜索了一下,现在知道 shell 只传递字符串。我将对象转换为 JSON,但随后由于 URI 长度过长而遇到异常。

老实说,我很失望。我以为这么重要的东西会在 shell 中实现...但是无论如何,你们是如何解决这个问题的?

最佳答案

毛伊岛

参见 (Xamarin) Process navigation data using a single method .

maui issue 中也提到了.在那里调整 Maui 调用:

await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", new MyData(...)} });

这使用 IQueryAttributableApplyQueryAttributes通过 IDictionary<string, object> query .
(Xamarin 示例显示 IDictionary<string, string> ,但它在 Maui 中显示为 , object,因此您可以传递任何对象值。)

因此您传递的字符串参数可以用来查找对应的对象。

来自那个 (Xamarin) 文档(修改为显示查找对象):

public class MonkeyDetailViewModel : IQueryAttributable, ...
{
public MyData Data { get; private set; }

public void ApplyQueryAttributes(IDictionary<string, object> query)
{
Data = (MyData)query["data"];
}
...
}

对于 Xamarin Forms,对字符串值的限制使这有点难看。一种方法是使用 static它包含可能的对象,您可以使用字符串查找这些对象。如果对象都是预定义的,这是可以容忍的,但如果您手动更改这些对象,则有点笨拙。

public class MonkeyDetailViewModel : IQueryAttributable, ...
{
public static Dictionary<string, MyData> KeyedData;

// "static": One-time class constructor.
public static MonkeyDetailViewModel()
{
KeyedData = new Dictionary<string, MyData>();
KeyedData["data1"] = new MyData(...);
// ... other versions of the data ...
}


public MyData Data { get; private set; }

public void ApplyQueryAttributes(IDictionary<string, string> query)
{
string whichData = query["data"]; // In example, gets "data1".
Data = KeyedData[whichData];
}
...
}

用法:

await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", "data1"} });

Xamarin 注意:静态字典使得维护 MyData 的多个实例成为可能。 . “黑客”替代方案是拥有 MyData Datastatic , 并在 GoToAsync 之前明确设置它- 但如果您在导航堆栈上有一个 MonkeyDetailView,转到第二个,然后返回第一个,这是有风险的 - 您将覆盖 Data第一眼所见。

关于xamarin.forms - 如何在 .net MAUI 或 Xamarin Forms 中使用复杂对象进行 Shell 导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72159711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com