我有一个包含一些项目的清单。
在列表下方,我希望必须单击按钮才能加载更多项目。(由于加载所有项目需要一些用户操作,例如输入 TAN,因此当用户滚动到列表末尾时不应自动完成此操作,但前提是他愿意这样做。)
我想要的是这样的视图:
但是,如果我将列表和按钮放在 VStack 中,按钮将始终显示在屏幕底部,而不仅仅是当我滚动到列表末尾时:
struct ContentView: View {
private let items = Range(0...15).map { "Item " + String($0) }
var body: some View {
VStack {
List(items, id: \.self) { item in
Text(item)
}
HStack {
Spacer()
Button("Load more") { print("Load more items") }
Spacer()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将按钮添加到列表中,按钮显然会显示为具有白色背景的列表项,并且列表中没有任何空间:
struct ContentView: View {
private let items = Range(0...15).map { "Item " + String($0) }
var body: some View {
List {
ForEach(items, id: \.self) { item …Run Code Online (Sandbox Code Playgroud) 在Java中的传统方法执行外部程序是开始一个新的Process,开始两个线程消耗其inputStream和errorStream,然后调用其阻塞Process.waitFor()等到外部命令已退出。
如何使用 Kotlin 协程以(几乎)非阻塞方式完成此操作?
我是这样试的。你有什么建议可以改进它吗?
(如何异步读取流,也调用ProcessBuilder.start()in withContext(Dispatchers.IO),对 Dispatchers.IO 的调用是否过多,...?)
suspend fun executeCommand(commandArgs: List<String>): ExecuteCommandResult {
try {
val process = ProcessBuilder(commandArgs).start()
val outputStream = GlobalScope.async(Dispatchers.IO) { readStream(process.inputStream) }
val errorStream = GlobalScope.async(Dispatchers.IO) { readStream(process.errorStream) }
val exitCode = withContext(Dispatchers.IO) {
process.waitFor()
}
return ExecuteCommandResult(exitCode, outputStream.await(), errorStream.await())
} catch (e: Exception) {
return ExecuteCommandResult(-1, "", e.localizedMessage)
}
}
private suspend fun readStream(inputStream: InputStream): String {
val readLines = mutableListOf<String>()
withContext(Dispatchers.IO) …Run Code Online (Sandbox Code Playgroud) 作为更大表单的一部分,我希望有一个带有列表的部分,其条目可以重新排序。
在整个视图中,应该只能编辑该特定列表,而不能编辑其他内容。因此我希望将编辑按钮放在列表附近。
如果我只是将 EditButton 设置为节标题,则可以对列表项重新排序,但无法显示节标题:
struct ContentView: View {
private let items = Range(1...4).map { "Item " + String($0) }
var body: some View {
Form {
Section(header: EditButton()) {
ForEach(items, id: \.self) { item in
Text(item)
}
.onMove(perform: reorderItems)
.onDelete(perform: deleteItems)
}
}
}
func reorderItems(from sourceIndices: IndexSet, to destinationIndex: Int) { /* ... */ }
func deleteItems(at offsets: IndexSet) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将 EditButton 包装在 HStack 中以在右侧显示按钮,则点击“编辑”会将按钮的标题更改为“完成”,但不再启动列表的编辑模式:
struct ContentView: View {
@Environment(\.editMode) var editMode
private …Run Code Online (Sandbox Code Playgroud)