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

3

最近我开始使用shell,发现页面转换更加流畅,并且通过替换 NavigationPage,修复了我遇到的一个错误。

所以,我对它很感兴奋。

然而,不久之后我意识到,我不能像使用页面构造函数一样,通过shell在页面之间发送对象。我进行了一些搜索,现在知道shell只传递字符串。我将对象转换为JSON,但由于URI长度太长而遇到了异常情况。

说实话,我很失望。我认为这么重要的东西应该被实现在shell中......但无论如何,你们怎么解决这个问题呢?

1个回答

1

对于Maui

请参阅(Xamarin)使用单个方法处理导航数据

也提到在maui问题中。根据那里的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。"hack"替代方案是将MyData Data设置为static,并在GoToAsync之前显式设置它,但如果您可能会在导航堆栈上有一个MonkeyDetailView,然后转到第二个视图,再返回第一个视图,则会覆盖第一个视图看到的Data,这是有风险的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接