最近我开始使用shell,发现页面转换更加流畅,并且通过替换 NavigationPage,修复了我遇到的一个错误。
所以,我对它很感兴奋。
然而,不久之后我意识到,我不能像使用页面构造函数一样,通过shell在页面之间发送对象。我进行了一些搜索,现在知道shell只传递字符串。我将对象转换为JSON,但由于URI长度太长而遇到了异常情况。
说实话,我很失望。我认为这么重要的东西应该被实现在shell中......但无论如何,你们怎么解决这个问题呢?
最近我开始使用shell,发现页面转换更加流畅,并且通过替换 NavigationPage,修复了我遇到的一个错误。
所以,我对它很感兴奋。
然而,不久之后我意识到,我不能像使用页面构造函数一样,通过shell在页面之间发送对象。我进行了一些搜索,现在知道shell只传递字符串。我将对象转换为JSON,但由于URI长度太长而遇到了异常情况。
说实话,我很失望。我认为这么重要的东西应该被实现在shell中......但无论如何,你们怎么解决这个问题呢?
对于Maui。
也提到在maui问题中。根据那里的Maui调用进行调整:
await Shell.Current.GoToAsync("//myAwesomeUri",
new Dictionary { {"data", new MyData(...)} });
IQueryAttributable
和 ApplyQueryAttributes
来传递一个 IDictionary<string, object> query
。(Xamarin示例中使用的是 IDictionary<string, string>
,但在Maui中是 , object
,因此您可以传递任何对象值。)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
。"hack"替代方案是将MyData Data
设置为static
,并在GoToAsync
之前显式设置它,但如果您可能会在导航堆栈上有一个MonkeyDetailView,然后转到第二个视图,再返回第一个视图,则会覆盖第一个视图看到的Data
,这是有风险的。