Khái niệm cốt lõi
Dữ liệu tự đến với bạn
Bạn không tự fetch dữ liệu. Một màn theo dõi (hoặc một presenter được đăng ký nhận (subscribe)), và SDK gọi hàm render của bạn với dữ liệu hiện tại, rồi gọi lại mỗi khi dữ liệu thay đổi. Sau một lượt mua, Shop, Header và màn Character đều nhận số dư mới từ chính lượt mua đó; bạn không cần gọi gì thêm.
// ❌ WRONG — this copy goes stale as soon as the server changes it
private long coreDust;
private void Start() => coreDust = header.Current.Currencies[0].Amount;
// ✅ CORRECT — subscribe once and render every change
private async void OnEnable()
{
lifetime = new CancellationTokenSource();
var token = lifetime.Token;
var headerSub = await header.SubscribeAsync(Render);
if (token.IsCancellationRequested)
{
headerSub.Dispose(); // the page closed while subscribing
return;
}
subscription = headerSub;
}
View và snapshot
Những gì bạn nhận được đều chỉ đọc:
- screen contract trả về một view (
ProjectVShopViewvà các view khác). View luôn giữ dữ liệu đã xác nhận gần nhất.IsLoadingchỉ là true cho tới khi dữ liệu đầu tiên về, vàLoadErrorgiải thích lần tải đầu bị lỗi. - presenter trả về một snapshot (
ProjectVHeaderSnapshotvà các snapshot khác) gồmStatus, dữ liệu, vàErrorkhi có lỗi.
Current trả về bản mới nhất, dành cho code vẽ (render) bên ngoài callback.
Server quyết định
Backend quyết định số dư, kho đồ, stamina (thể lực), cấp độ, chi phí nâng cấp, giới hạn của shop, trạng thái khoá nhiệm vụ, phần thưởng và sao. Hiện đúng những gì SDK đưa cho bạn. Các bản xem trước mà SDK cung cấp (xem trước EXP, xem trước vật rơi, đếm ngược stamina) chỉ để hiển thị; đừng bao giờ biến chúng thành giá trị của riêng bạn.
Một lần bấm, một request
- Mở một màn thường không gửi request nào; dữ liệu đã được tải sẵn.
- Một command (lệnh) gửi một request, và kết quả của nó cập nhật mọi màn đang hiện dữ liệu bị thay đổi.
- Bấm lại khi command đang chạy sẽ không gửi lần thứ hai.
Vì vậy: không refresh sau command, không refresh khi mở scene, không reload định kỳ.
Đăng xuất và đổi tài khoản
Sau khi đăng xuất, xoá tài khoản hoặc đăng nhập bằng người khác, toàn bộ dữ liệu của tài khoản trước bị xoá. View và snapshot cũ không được điều khiển UI nữa; các màn sẽ nhận dữ liệu của tài khoản mới khi nó tải xong.
Vòng đời
Screen contract và presenter sống cùng app. Observe hoặc SubscribeAsync
của trang thì sống cùng trang: tạo khi trang mở, dispose (giải phóng) khi trang
đóng.
Tiếp theo: Tích hợp scene.