练习 - 访问 Blazor Hybrid 中的平台功能

已完成

在本练习中,你将添加将待办事项列表保存并加载到文件系统的功能。

添加“加载”和“保存”按钮

  1. 首先,为“加载”和“保存”按钮添加两个新的 <button> 元素,它们位于 Todo.razor 文件中的 <h3> 下方以及待办事项列表的上方。

    @page "/todo"
    @using BlazorHybridApp.Data
    
    <h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>
    
    <button @onclick="Save">Save</button>
    <button @onclick="Load">Load</button>
    
    <ul class="list-unstyled">
        @foreach (var todo in todos)
        {
            <li>
                <input type="checkbox" @bind="todo.IsDone" />
                <input @bind="todo.Title" />
            </li>
        }
    </ul>
    
  2. @code 块中为 SaveLoad 功能添加两个方法:

    private async Task Save()
    {
    }
    
    private void Load()
    {
    }
    

保存数据并加载到磁盘

.NET 包含 System.IO 命名空间,该命名空间包含将文件加载和保存到磁盘的功能。 .NET MAUI 会自动将此功能映射到本机 API;只需指定文件保存位置。 每个平台都有用于保存用户数据的特殊位置。 .NET MAUI 中的文件系统帮助程序提供对多个平台目录的访问,包括缓存和应用数据目录。 它还可以加载直接绑定到应用中的文件。 现在,让我们通过使用 .NET 中内置的 System.Text.Json 方法来实现 Save 方法。

  1. Microsoft.Maui.StorageSystem.Text.JsonSystem.IO 的 using 指令添加到 Todo.razor 文件的顶部。

    @page "/todo"
    @using BlazorHybridApp.Data
    @using Microsoft.Maui.Storage
    @using System.IO
    @using System.Text.Json
    
  2. 通过将数据序列化到 string 来实现 Save,为文件创建路径,并将内容写入文件:

    private async Task Save()
    {
        var contents = JsonSerializer.Serialize(todos);
        var path = Path.Combine(FileSystem.AppDataDirectory, "todo.json");
        File.WriteAllText(path, contents);
        await App.Current.MainPage.DisplayAlert("List Saved", $"List has been saved to {path}", "OK");
    }
    

    请注意,我们还可以访问平台弹出窗口。 保存文件时,此处将显示一个警报。

  3. 通过从磁盘加载数据、反序列化数据并将项加载到待办事项列表中来实现 Load

    private void Load()
    {
        var path = Path.Combine(FileSystem.AppDataDirectory, "todo.json");
        if (!File.Exists(path))
            return;
        var contents = File.ReadAllText(path);
        var savedItems = JsonSerializer.Deserialize<List<TodoItem>>(contents);
        todos.Clear();
        todos.AddRange(savedItems);
    }
    
  4. 保存文件。 如果应用尚未运行,请将其重启。

  5. 添加项、编辑项并将项标记为“已完成”以测试组件。 选择 Save 按钮以将项保存到磁盘,然后关闭再重启应用或进行更改,并选择 Load 加载已保存的数据。

    Screenshot of the completed ToDo page with load and save buttons.