Alguns ícones têm um estado que precisa ser salvo, enquanto outros são instanciados com base no estado já existente. Por exemplo, os ícones de comentários precisam salvar o texto, enquanto os ícones de aviso não, porque são instanciados com base na forma como os blocos estão conectados.
Se o ícone precisar salvar o estado, implemente a
interface ISerializable
e register.
O estado retornado pelo ícone é incluído na propriedade icons
do
estado do bloco:
{
'blocks': {
'languageVersion': 0,
'blocks': [
{
'type': 'my_block',
'icons': {
// Your state goes here!
'my_icon': 'some state',
}
}
]
}
}
Salvar estado
Para salvar o estado do ícone, é necessário implementar o método
saveState
da interface
ISerializable
. que pode retornar um JSON arbitrário, que é transmitido ao método loadState
.
saveState() {
return this.state; // Some arbirtary JSON-compatible data.
}
Serialização completa e dados de backup
saveState
também recebe um parâmetro doFullSerialization
opcional. É
usado por ícones que fazem referência ao estado serializado por um
serializador diferente (como modelos de dados de apoio). O parâmetro sinaliza que
o estado referenciado não estará disponível quando o bloco for desserializado. Portanto, o
ícone precisa serializar todo o próprio estado de apoio. Por exemplo, isso é verdadeiro
quando um bloco individual é serializado ou quando um bloco é copiado e colado.
Dois casos de uso comuns para isso são:
- Quando um bloco individual é carregado em um espaço de trabalho em que o modelo de dados de apoio não existe, o ícone tem informações suficientes no próprio estado para criar um novo modelo de dados.
- Quando um bloco é copiado e colado, o ícone sempre cria um novo modelo de dados de apoio em vez de referenciar um existente.
Estado de carregamento
Para salvar o estado do ícone, é necessário implementar o método
loadState
da interface
ISerializable
. Esse método usa o JSON retornado pelo método saveState
.
loadState(state) {
this.state = state;
}
Registrar classes de ícones
Por fim, você precisa registrar o ícone para que o sistema de serialização possa
instanciar. Lembre-se de que o IconType
usado para registrar o
ícone precisa ter a mesma string que o retornado pelo
método getType
.
class myIcon extends Blockly.icons.Icon {
getType() {
return new Blockly.icons.IconType('my_icon');
}
}
Blockly.icons.registry.register(
new Blockly.icons.IconType('my_icon'), myIcon);