首页 > 解决方案 > 如何在 rust tui 应用程序中切换屏幕(termion + tui-rs)

问题描述

我有一个 tui 应用程序,其中通过列表向用户提供了一些选择。一旦他们导航到他们想要的选择并按回车键,我想将他们带到“下一个”屏幕。

它比清除现有文本并打印新文本更复杂,因为我还需要替换键绑定并基本上开始一个新tui-rs循环。更多内容如下。

屏幕 1 的代码:

pub fn draw_screen() -> Result<(), Box<dyn Error>> {
    // Terminal initialization
    let stdout = io::stdout().into_raw_mode()?;
    let stdout = MouseTerminal::from(stdout);
    let stdout = AlternateScreen::from(stdout);
    let backend = TermionBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    let events = Events::new();

    loop {
        terminal.draw(|f| {
            // user shown a list they can navigate through using arrow keys
        });

        match events.next()? {
            Event::Input(input) => match input {
                Key::Char('q') => {
                    break;
                }
                Key::Char('\n') => {
                    // this is where I need to "send" them to a new screen
                }
                Key::Down => {
                    // my_list won't exist on next screen
                    my_list.items.next();
                }
                Key::Up => {
                    my_list.items.previous();
                }
                _ => {}
            },
            _ => {}
        }
    }

    Ok(())
}

可以看出底部的键绑定是特定于这个屏幕的。例如,在下一个屏幕上不会有 amy_list而是可能有 amy_another_listmy_box根本没有。

因此,如果我所做的只是清除文本,我仍然会被留在具有相同键绑定的同一个循环中 - 不起作用。

用新的键绑定启动新循环的正确方法是什么?

标签: rusttui

解决方案


推荐阅读