Skip to content

CodeEditor in Compose

Jetpack Compose是用于Android开发的新框架。如果您尝试使用Sora Editor,同时使用使用Jetpack Compose构建的应用程序。本文档可能会对您有所帮助。

我的英语可能不好,如果有的话请纠正它们。谢谢。

创建状态持有者

首先,我们将定义一个CodeEditorState,封装并持有CodeEditor的状态.

kotlin
data class CodeEditorState(
    val editor: CodeEditor? = null,
    val initialContent: Content = Content()
) {
    var content by mutableStateOf(initialContent)
}

您可以根据需要添加许多状态。

注意

如果您不想使用ViewModel而是希望使用remember*()可组合函数,您可以进行以下操作:

kotlin
@Composable
fun rememberCodeEditorState(
    initialContent: Content = Content()
) = remember {
    CodeEditorState(
        initialContent = initialContent
    )
}

创建CodeEditor可组合项

现在,我们将创建CodeEditor可组合项,它通过AndroidView间接地实现可组合化。在这个可组合项中,它将接受一个与CodeEditorState类型的参数state.

kotlin
@Composable
fun CodeEditor(
    modifier: Modifier = Modifier,
    state: CodeEditorState
) {
    // ...
}

设置CodeEditor工厂

我们需要一个Context以实例化一个CodeEditor

kotlin
private fun setCodeEditorFactory(
    context: Context,
    state: CodeEditorState
): CodeEditor {
    val editor = CodeEditor(context)
    editor.apply {
        setText(state.content)
        // ...
    }
    state.editor = editor
    return editor
}

一旦我们完成了工厂的创建,我们现在就可以用remember可组合函数进行管理.

kotlin
@Composable
fun CodeEditor(
    modifier: Modifier = Modifier,
    state: CodeEditorState
) {
    val context = LocalContext.current
    val editor = remember {
        setCodeEditorFactory(
            context = context,
            state = state
        )
    }
    AndroidView(
        factory = { editor },
        modifier = modifier,
        onRelease = {
            it.release()
        }
    )
    // ...
}

CodeEditor的状态设置LaunchedEffect

CodeEditor的状态发生变化时执行某些代码,我们需要使用LaunchedEffect

kotlin
LaunchedEffect(key1 = state.content) {
    state.editor?.setText(state.content)
}

使用CodeEditor可组合项

在我们完成CodeEditor可组合项后,我们就可以在应用程序中使用它。首先,强烈建议ViewModel中定义CodeEditorState

例如,在MainScreen中,我们将创建一个MainViewModel,在这个viewmodel中,我们定义了一个CodeEditorState

kotlin
class MainViewModel : ViewModel() {
    val editorState by mutableStateOf(
        CodeEditorState()
    )
}

接着在MainScreen可组合项中,使用Modifier对您的CodeEditor进行必要的调整。

kotlin
@Composable
fun MainScreen(
    viewModel: MainViewModel = viewModel()
) {
    Column {
        CodeEditor(
            modifier = Modifier
                .fillMaxSize(),
            state = viewModel.editorState
        )
    }
}

警告

如果CodeEditor的底部有可组合项,请使用Modifier.weight(1f)而不是Modifier.fillMaxSize()。否则CodeEditor将会占满整个容器。

结语

一般情况下,CodeEditor是我们唯一需要使用AndroidView的小部件。至于其他类似于SymbolInputView的组件,目前建议完全使用Compose进行实现。


以上便是全部。我并不知道在JetPack Compose中使用Sora编辑器的CodeEditor是否是一个正确的选择,但我希望您能通过本指南获得灵感。感谢您的阅读。

基于 LGPL-2.1 许可发布