Beagle v1.5 não é mais mantida ativamente. A versão documentada que você está visualizando pode conter funcionalidades depreciadas. Para obter as funcionalidades mais recentes, consulte a nossa última versão .
Beagle Navigation Controller é uma classe como uma UINavigationController
, porém focada em observar o estado da tela server-driven para, por exemplo, saber quando ela inicia ou finaliza.
O serverDrivenStateDidChange()
é o método que observa as mudanças de estado da tela.
A implementação padrão mostra um “ActivityIndicator” enquanto o estado da tela é “loading” e nada acontece. Se um erro acontece, você pode sobrescrever esse método para tratar o erro.
Caso queira preservar o loading depois que ele for sobrescrito, você deve implementar o “super” ou personalizar o próprio loading.
Confira abaixo a classe BeagleNavigationController:
open class BeagleNavigationController: UINavigationController {
open func serverDrivenStateDidChange(
to state: ServerDrivenState,
at screenController: BeagleController
) {
switch state {
case .started:
view.showLoading(.whiteLarge)
case .finished:
view.hideLoading()
case .success, .error:
break
}
}
}
O ServerDrivenState é um enum que define as possibilidades de estados da tela. Veja essa estrutura abaixo:
public typealias BeagleRetry = () -> Void
public enum ServerDrivenState {
case started
case finished
case success
case error(ServerDrivenState.Error, BeagleRetry)
}
extension ServerDrivenState {
public enum Error: Swift.Error {
case remoteScreen(Request.Error)
case action(Swift.Error)
case lazyLoad(Request.Error)
case submitForm(Request.Error)
case webView(Swift.Error)
case declarativeText
}
}
class CustomBeagleNavigationController: BeagleNavigationController {
private var errorView = ErrorView(message: nil) { }
override func serverDrivenStateDidChange(
to state: ServerDrivenState,
at screenController: BeagleController
) {
super.serverDrivenStateDidChange(to: state, at: screenController)
guard case let .error(serverDrivenError, retry) = state else { return }
let message: String
switch serverDrivenError {
case .remoteScreen(let error), .lazyLoad(let error), .submitForm(let error):
switch error {
case .networkError(let messageError):
message = messageError.localizedDescription
case .decoding(let messageError):
message = messageError.localizedDescription
case .loadFromTextError, .urlBuilderError:
message = error.localizedDescription
}
case .action(let error):
message = error.localizedDescription
default:
message = "Unknow Error."
}
if !view.subviews.contains(errorView) {
errorView = ErrorView(message: message, retry: retry)
errorView.present(in: view)
} else {
errorView.addRetry(retry)
}
}
}
let dependencies = BeagleDependencies()
dependencies.navigation.registerNavigationController(
builder: CustomBeagleNavigationController.init,
forId: "CustomBeagleNavigation"
)
Beagle.dependencies = dependencies
Quando iniciar uma BeagleScreenViewController, você deve passar o parâmetro controllerId
com o id escolhido para sua custom BeagleNavigationController e usar a controller desejada.
func screenController() -> UIViewController {
let screen = Screen(
child: Text()
)
return BeagleScreenViewController(
.declarative(screen),
controllerId: "CustomBeagleNavigation"
)
}
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.