最近,我开始使用shell,我注意到页面转换方面的改进,我使用NavigationPage时遇到的一个bug是通过用shell替换它来修复的。
所以我很兴奋能用它。
然而,在我意识到我不能像使用页面的构造器那样从一个页面发送到另一个页面之后,我就不能通过shell发送对象。我搜索了一下,现在知道shell只传递字符串。我将对象转换为JSON,但由于URI长度较长,因此遇到了异常。
老实说我很失望。我以为这样重要的东西会在shell中实现.但无论如何,你们是怎么处理这件事的?
发布于 2022-05-08 20:07:42
Maui。
在毛伊岛问题中也提到了。在那里修改Maui调用:
await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", new MyData(...)} });这使用IQueryAttributable和ApplyQueryAttributes传递IDictionary<string, object> query。
( Xamarin示例显示IDictionary<string, string>,但它的, object在Maui中,因此可以传递任何对象值。)
因此,您传递的字符串参数可以用于查找相应的对象。
从(Xamarin) doc (修改以显示查找对象):
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"} });注意:静态字典使维护MyData的多个实例成为可能。"hack“的替代方法是让MyData Data be static,并在GoToAsync之前显式地设置它--但是如果您曾经在nav堆栈上有一个MonkeyDetailView,转到第二个MonkeyDetailView,然后返回到第一个MonkeyDetailView,那么这是很危险的--您将覆盖第一个视图所看到的Data。
https://stackoverflow.com/questions/72159711
复制相似问题