Lifecycle (presenter)
ํฐ ๊ฐ๋
WillPushEnterAsync ์์ view์์ ๋ณด์ด๋ ๋ถ๋ถ์ ์ด๊ธฐํํ๋ค.
ํ๋ฉด์ด ์ ํ๋๋ ์ ๋๋ฉ์ด์ ๋์ค์๋ ๋น ํ๋ฉด์ด ๋์ค๊ฑฐ๋ ์๋ชป๋ ์์น๋ฑ์ด ํ์๋๋ ์ผ์ด ์๋๋กํ๊ธฐ ์ํจ์ด๋ค.
View์ ํ์๋์ด์ผ ํ ๋ด์ฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก Model์์ ๋ชจ๋ ๋ฐ์์์ Presenter์์ View์ ์ฐ๊ฒฐ์ํจ๋ค.
Model์ ๋ฐ์ดํฐ ๊ฐ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ reactiveํ๊ฒ ์กด์ฌํ๋ค.
DidPushEnter ์์ view์ ์ธํฐ๋ ํฐ๋ธํ behaviour๋ฅผ ์ ์ํ๋ค.
DidPushEnter๋ ๋ชจ๋ ์ ํ ์ ๋๋ฉ์ด์ ์ด ๋๋ ํ ๋ฐ์ํ๋ค.
๋ชจ๋ ์ ํ ์ ๋๋ฉ์ด์ ์ด ๋๋ ํ ๋ฒํผ ์ด๋ฒคํธ ๋ฑ์ ๋ชจ๋ ์ฌ์ฉ์ ์ก์ ์ฒ๋ฆฌ๋ฅผ ๋ฑ๋กํ๋ ์ด์ ๋:
์ ํ ๋์ค์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ด ๊ฐ๋ฅํ๋ฉด ์๊ธฐ์น ๋ชปํ ์ํฉ์ด ๋๋ฌด ๋ง์ด ๋ฐ์ํ๋ค.
์ฌ์ฉ์ ์ ์ฅ์์๋ ์ ํ ๋์ค์ ๋ฒํผ ํด๋ฆญ๋ฑ์ ์ธํฐ๋ ์ ์ด ๊ฐ๋ฅํ๋ ์ฌ๋ถ๋ ์ค์ํ์ง ์๋ค.
์ฌ์ฉ์ ์ ์ฅ์์๋ ์ ํ ์ ๋๋ฉ์ด์ ๋์ค์ ๋นํ๋ฉด์ด๋ ๋ ์์ฑ๋ ํ๋ฉด์ด ํ์๋๋ ๋ฑ์ ์ํฉ์ด ๋ ์ ๊ฒฝ์ฐ์ด๋ ๋ถ๋ถ์ธ๋ฐ, ์ด๋ WillPushEnterAsync์์ ๋ชจ๋ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ๋ค.
Asset์ ํค๊ฐ์ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ฃ๋๋ค.
AssetName
์ดํธ๋ฆฌ๋ทฐํธ์ ์์
ํค๊ฐ์ ๋ฃ๋๋ค. ๋๋ ๋ชจ๋ ์์
๋ค์ Addressable๋ก ๊ด๋ฆฌํ๊ธฐ๋ฅผ ์ถ์ฒํ๋ค. ๊ฐ๋จํ ๊ตฌํ์ Resources ํด๋์ ํ๋ฆฌํฉ์ ๋ฃ๊ณ ์ด๋ฅผ ํค๊ฐ์ผ๋ก ์ฃผ๋ ๋ฐฉ์์ผ๋ก๋ ๊ฐ๋ฅํ๋ค. ์์ธํ ๋ด์ฉ์ UnityScreenNavigator ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต์ Readme ์ฐธ๊ณ .
์์ฑ๋ ์ฝ๋
[AssetName("MainUI/Modal/SignInModal.prefab")]
public class SignInModalLifecycle : LifecycleModalBase
{
private string _currentId = string.Empty;
private string _currentPassword = string.Empty;
private readonly SignInModalView _view;
private readonly ModalManager _modalManager;
private readonly ISignInUseCase _signInUseCase;
private readonly PageEventPublisher _pageEventPublisher;
[Inject]
public SignInModalLifecycle(SignInModalView view, ModalManager modalManager, ISignInUseCase signInUseCase, PageEventPublisher pageEventPublisher) : base(view)
{
_view = view;
_modalManager = modalManager;
_signInUseCase = signInUseCase;
_pageEventPublisher = pageEventPublisher;
}
protected override UniTask WillPushEnterAsync(CancellationToken cancellationToken)
{
base.WillPushEnterAsync(cancellationToken);
var model = new SignInModalModel();
_view.SetView(model);
return UniTask.CompletedTask;
}
public override void DidPushEnter()
{
base.DidPushEnter();
var currentId = string.Empty;
var currentPassword = string.Empty;
// Disable the sign-in button
_view.SetSignInButtonInteractable(false);
// ID input event processing
_view.OnIdInputFieldEditAsync
.ForEachAwaitAsync(async id =>
{
currentId = id;
UpdateButtonState(currentId, currentPassword);
await UniTask.CompletedTask;
}, ExitCancellationToken)
.Forget();
// Password input event processing
_view.OnPasswordInputFieldEditAsync
.ForEachAwaitAsync(async password =>
{
currentPassword = password;
UpdateButtonState(currentId, currentPassword);
await UniTask.CompletedTask;
}, ExitCancellationToken)
.Forget();
_view.OnSignInButtonClickedAsync
.ForEachAwaitAsync(async _ =>
{
await OnSignInButtonClicked();
}, ExitCancellationToken)
.Forget();
}
// If both id and password are not empty, enable the sign-in button
private void UpdateButtonState(string id, string password)
{
bool isInteractable = !string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(password);
_view.SetSignInButtonInteractable(isInteractable);
}
// When the sign-in button is clicked, send a sign-in request
private async UniTask OnSignInButtonClicked()
{
var logInInfo = _view.GetCurrentInput();
var response = await _signInUseCase.SignIn(new ISignInUseCase.SignInRequestData(logInInfo.ID, logInInfo.Password));
// If the sign-in is successful, close the modal
if (response.IsSuccess)
{
_pageEventPublisher.SendPushEvent(new EntryPageBuilder(true, true));
await _modalManager.Pop(true, ExitCancellationToken);
}
}
}
Last updated