问题是我想在文本字段的值末尾添加“,00”,在iOS设备中效果很好,但是在android中,光标移动到文本字段中值的起点。因此,我无法添加“,00”。
答案 0 :(得分:4)
这对我有用:
_inputCtrl.value = TextEditingValue(
text: suggestion,
selection: TextSelection.collapsed(offset: suggestion.length),
);
https://github.com/flutter/flutter/issues/11416#issuecomment-507040665
答案 1 :(得分:4)
这对我来说就像一个魅力。
myController.text = newText;
myController.selection = TextSelection(
baseOffset: newText.length,
extentOffset: newText.length)
答案 2 :(得分:3)
检查了setter
的{{1}}的{{1}}的注释,它说[text]和[selection]不应同时更改,但是对于电话输入时,我们希望对输入应用某种格式(例如'131 1111 1111'),同时将光标始终保持在末尾。
所以我只使用自定义的TextEditingController
,就可以了!
text
答案 3 :(得分:1)
我通过使用此问题解决了
这会将光标置于文本字段的末尾。
您可以随时随地调用代码,它会在调用时设置光标位置。
或简单地将此代码放在textfield的onChanged()
方法中
final val = TextSelection.collapsed(offset: _textTEC.text.length);
_textTEC.selection = val;
答案 4 :(得分:1)
以下代码对我来说很完美。
_controller.value = _controller.value.copyWith(
text: newText,
selection: TextSelection.fromPosition(
TextPosition(offset: newText.length),
),
);
答案 5 :(得分:0)
您需要一个FocusNode
并设置TextSelection
来放置光标。
此处的代码可能是一个开始:Position cursor at end of TextField when focused?
答案 6 :(得分:0)
似乎可行的解决方案如下:
为您的文本字段的构造函数提供TextEditingController参数:
var myTextEditingController = TextEditingController();
var myTextField = TextField(..., controller: myTextEditingController);
在文本字段中设置新文本时,使用TextEditingController就像这样:
myTextEditingController.value.copyWith(
text: newText,
selection: TextSelection(
baseOffset: newText.length,
extentOffset: newText.length
)
)
这似乎很复杂,但它似乎是解决Flutter文本字段中未更新光标问题的唯一解决方案。
答案 7 :(得分:0)
我在设置TextEditingController时遇到了同样的问题,这对我有用。
controller.text = someString;
controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
TextSelection.fromPosition()执行以下操作(来自文档):
在给定的文本位置创建一个折叠的选择。崩溃了 选择以相同的偏移量开始和结束,这意味着它包含 零个字符,但用作文本中的插入点。
答案 8 :(得分:0)
如果您想在文本中间添加特殊字符(在您的情况下为_textController.text.length
,请使用00
作为光标的基本偏移量)。在这种情况下,以下解决方案应该起作用:
String specialChars = '00';
int length = specialChars.length;
// current cursor position, where you want to add your special characters
int cursorPos = _textController.selection.base.offset;
// the text before the point you want to add the special characters
String prefixText = _textController.text.substring(0, cursorPos);
// the text after the point ...
String suffixText = _textController.text.substring(cursorPos);
_textController.text = prefixText + specialChars + suffixText;
// set the cursor position right after the special characters
_textController.selection = TextSelection(baseOffset: cursorPos + length, extentOffset: cursorPos + length);
或者您可以这样做,这是同一回事:
int cursorPos = _textController.selection.base.offset;
_textController.value = _textController.value.copyWith(
text: _textController.text.replaceRange(cursorPos, cursorPos, '00'),
selection: TextSelection.fromPosition(TextPosition(offset: cursorPos + 2))
);
答案 9 :(得分:0)
创建一个新的Dart类,扩展TextEditingController,然后可以使用行为如下的自定义TextController:
class TextController extends TextEditingController {
TextController({String text}) {
this.text = text;
}
set text(String newText) {
value = value.copyWith(
text: newText,
selection: TextSelection.collapsed(offset: newText.length),
composing: TextRange.empty
);
}
}
答案 10 :(得分:0)
根据 documentation 将文本和位置设置在一起的可能方法是使用 value
... 像这样:
_controller.value = _controller.value.copyWith(text: newText, selection: newSelection)
答案 11 :(得分:0)
有很多解决方案,但在下面的代码中,我合并了 Github 和 SO 的最佳答案。
以下对 Dart >= 2.12 具有 null-safety 并使用最新的 @client.command()
async def playyt(ctx, url):
song_there = os.path.isfile("song.mp3")
try:
if song_there:
os.remove("song.mp3")
except PermissionError:
em8 = discord.Embed(title = "Music Is Currently Playing", description = 'Please wait for the current playing music to end or use %leave <:_Paimon6:827074349450133524>.\nMusic provided by {ctx.author.mention} <:_Paimon6:827074349450133524>',color = ctx.author.color)
await ctx.send(embed = em8)
return
voiceChannel = discord.utils.get(ctx.guild.voice_channels)
await voiceChannel.connect()
voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
em6 = discord.Embed(title = "Downloading Youtube Music", description = f'{url}\n\nPlease wait for paimon to setup the music you provide.\nMusic provided by {ctx.author.mention} <:_Paimon6:827074349450133524>',color = ctx.author.color)
await ctx.send(embed = em6, delete_after = 2)
await ctx.message.delete()
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '196',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
for file in os.listdir("./"):
if file.endswith(".mp3"):
os.rename(file, "song.mp3")
voice.play(discord.FFmpegPCMAudio("song.mp3"))
em1 = discord.Embed(title = "Now Listening Youtube Music", description = f'{url}\n\nPlease use %leave first to change music.\nMusic provided by {ctx.author.mention} <:_Paimon6:827074349450133524>',color = ctx.author.color)
videoID = url.split("watch?v=")[1].split("&")[0]
em1.set_thumbnail(url = f'https://img.youtube.com/vi/{videoID}/default.jpg'.format(videoID = videoID))
await ctx.send(embed = em1)
API
TextSelection
答案 12 :(得分:0)
您可以使用..功能如果您在控制器中设置值如下:
final _controller = TextEditingController()..text = txtValue
..selection = TextSelection.collapsed(offset: txtValue.length);
)
我认为在设置值运行时非常有用。