我需要使自定义文本编辑器可组合,具有一些自定义行为和外观,这应该与 import 'package:flutter/material.dart';
class Testee extends StatefulWidget {
@override
_TesteeState createState() => _TesteeState();
}
class _TesteeState extends State<Testee> {
String loremOne =
"Nostrud cillum ea do sit eu sint reprehenderit est tempor amet. Ex minim cupidatat exercitation officia mollit occaecat dolor sint sit aliqua dolore velit exercitation duis. Eu cupidatat pariatur aliquip aliquip ipsum sint ad ullamco irure eiusmod velit mollit ut elit.";
String loremTwo = "Fugiat aute eu tempor et consequat nulla.";
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.amberAccent,
body: SafeArea(
child: Padding(
padding: EdgeInsets.all(15.0),
child: ListView(
children: [
Wrap(
direction: Axis.horizontal,
spacing: 10.0,
children: [
Text(loremOne),
Icon(Icons.circle, size: 16),
Text(loremOne),
Icon(Icons.circle, size: 16),
Text(loremTwo),
],
),
//may you can compare your wrap with Richtext below
RichText(
text: TextSpan(children: [
TextSpan(text: loremOne),
WidgetSpan(child: Icon(Icons.circle, size: 16)),
TextSpan(text: loremOne),
WidgetSpan(child: Icon(Icons.circle, size: 16)),
TextSpan(text: loremTwo),
]))
],
),
),
),
);
}
}
可组合完全不同,因此我从 TextField
可组合开始。
我遇到两个问题:单击可组合项时无法打开键盘。并且不要设法让 Text 成为焦点。我相信后者是前者的原因。
这是可组合的简化版本:
Text
尽管同时具有 @ExperimentalComposeUiApi
@Composable
fun FocusText(
modifier: Modifier,
text: String
) {
val keyboardController = LocalSoftwareKeyboardController.current
val focusRequester = remember { FocusRequester() }
Text(
text = text,
modifier = modifier
.focusable(true)
.focusModifier()
.focusRequester(focusRequester)
.onFocusChanged { it: FocusState ->
println("xxx onFocusChanged: $it")
}
.clickable {
println("xxx onClick")
focusRequester.requestFocus()
keyboardController?.show()
}
)
}
和 .focusable(true)
并在 .focusModifier()
中调用 requestFocus()
,但可组合对象在点击它时没有获得焦点。
此外,键盘没有打开。
我做错了什么?
答案 0 :(得分:1)
您可以使用 BasicTextField
代替 Text
。
它基本上是通过硬件或软件键盘的 EditText
,没有装饰提示或占位符。当然可以添加。
类似于:
var value by rememberSaveable { mutableStateOf("edit text") }
BasicTextField(
value = value,
onValueChange = { value = it }
)