Fragments
Fragment - это специальный тип виджета, предназначенный для реализации гибкого кеширования и обработки тех частей UI, которые могут быть созданы заранее и для создания которых не требуются данные в runtime. Использование этого типа виджетов позволяет эффективно декомпозировать большие экраны и оптимизировать производительность приложения.
Для чего нужны Fragment
Fragment предоставляет механизм для предварительного создания и кеширования повторяющихся элементов интерфейса. Основные преимущества:
- Производительность: Предварительно созданные фрагменты не требуют повторной обработки
- Декомпозиция: Упрощает структуру больших экранов, разбивая их на переиспользуемые части
- Кеширование: Статичные части UI создаются о дин раз и используются многократно
- Оптимизация: Снижает нагрузку на runtime за счет переноса обработки на этап сборки
Как использовать Fragment
Fragment использует два параметра:
tag(обязательный) - уникальный идентификатор фрагментаid(необязательный) - идентификатор экземпляра виджета
Фрагменты должны быть зарегистрированы в DuitRegistry перед использованием. При обработке виджета Fragment будет заменен содержимым, ассоциированным с указанным tag.
package main
import (
"github.com/Duit-Foundation/duit_go/v4/pkg/duit_widget"
"github.com/Duit-Foundation/duit_go/v4/pkg/duit_attributes"
)
func headerFragment() *duit_core.DuitElementModel {
return duit_widget.Container(
&duit_attributes.ContainerAttributes{
Color: "#4285F4",
Padding: &duit_attributes.EdgeInsets{
Left: 16,
Right: 16,
Top: 16,
Bottom: 16,
},
},
"header_container",
).AddChild(
duit_widget.Text(
&duit_attributes.TextAttributes{
Data: "Welcome to Duit!",
Style: &duit_attributes.TextStyle{
FontSize: 24,
Color: "#FFFFFF",
},
},
"header_text",
),
)
}
func mainScreen() string {
builder := DuitView.Builder()
root := builder.CreateRootOfExactType(duit_core.Column, &duit_attributes.ColumnAttributes{
MainAxisAlignment: duit_props.MainAxisAlignmentStart,
}, "root")
root.AddChildren(
// Используем зарегистрированный фрагмент
duit_widget.Fragment("header", "header-1"),
duit_widget.Container(
&duit_attributes.ContainerAttributes{
Padding: &duit_attributes.EdgeInsets{
All: 16,
},
},
"content_container",
).AddChild(
duit_widget.Text(
&duit_attributes.TextAttributes{
Data: "Main content goes here",
},
"content_text",
),
),
)
// Регистрируем фрагмент
embedded := []*ComponentDescription{
{
Tag: "header",
LayoutRoot: headerFragment(),
},
}
builder.SetEmbedded(embedded)
return builder.Build()
}