系统对象:显示对象

显示对象(Display)是指示如何显示特定类型对象的字段的对象。

public struct Display<phantom T: key> has key, store {
    id: UID,
    /// 包含展示的字段
    /// 现支持的字段: name, link, image 和 description.
    fields: VecMap<String, String>,
    /// 版本号只能有出版人手动更新
    version: u16
}

如果一个账户同时持有 MyObject 和 Display,则 Web 界面可以查看 Display 中的字段, 以了解如何格式化和显示 MyObject 的字段。

module 0x123::my_module {
    public struct MyObject has key {
        id: UID,
        num_value: u64,
        string_value: String,
    }
    
    public fun create_display_object(publisher: &Publisher, ctx: &mut TxContext) {
        let display_object = display::new<MyObject>(&publisher, ctx);
        display::add_multiple(
            &mut display,
            vector[
                utf8(b"num_value"),
                utf8(b"string_value"),
            ],
            vector[
                utf8(b"Value: {num_value}"),
                utf8(b"Description: {string_value}"),
            ],
        );
        display::update_version(&mut display);
    }
}

为了创建显示对象,我们需要一个指向发布者对象的引用,该对象位于部署 MyObject 的模块中。 假设我们已经创建了这个对象(参见上一课)并将其存储在我们控制的账户中,我们可以使用这个账户来调用 create_display_object。 创建显示对象后,我们可以通过调用 display::add_multiple 并传递两个向量来添加格式化规则, 一个用于 MyObject 中要显示的字段列表,另一个用于格式化规则。

设置格式化规则后,我们可以调用 display::update_version 来最终确定对显示对象的更新。 一旦创建了显示对象,将会发出一个事件,允许 Sui 网络节点检测显示对象。 随后,每当通过节点 API 获取对象时,其显示字段也会按照指定的格式计算,并与对象的其他字段一起返回。