Я пытаюсь добавить маркеры в текстовое поле флаттера, но не могу этого сделать. Я провел исследования и разработки в этом направлении и нашел это, но это также неудовлетворительное решение.
вот полный код:
import 'package:flutter/material.dart';
const String bullet = '\u2022';
class SampleView extends StatefulWidget {
const SampleView({super.key});
@override
State<SampleView> createState() => _SampleViewState();
}
class _SampleViewState extends State<SampleView> {
TextEditingController controller = TextEditingController();
int currentTextLength = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(20.0),
child: Center(
child: TextField(
minLines: 1,
maxLines: 5,
controller: controller,
decoration: const InputDecoration(
hintText: "Type Here..."
),
onChanged: (value) {
if (value.isNotEmpty) {
if (value[0] != bullet) {
value = '$bullet $value';
controller.text = value;
controller.selection = TextSelection.fromPosition(
TextPosition(offset: controller.text.length));
}
if (value[value.length - 1] == '\n' &&
value.length > currentTextLength) {
controller.text = '$value$bullet ';
controller.selection = TextSelection.fromPosition(
TextPosition(offset: controller.text.length));
}
currentTextLength = controller.text.length;
}
},
),
),
),
);
}
}
вывод с проблемой: посмотрите это видео
Как вы можете видеть, если я начну редактировать текст посередине, маркеры не будут добавляться после новой строки.





После долгих исследований я нашел решение с помощью своего старшего. Он предложил мне использовать виджет inputFormatters of TextField().
и волшебным образом все сработало так, как я хотел.
Вот полный код:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class SampleView extends StatefulWidget {
const SampleView({super.key});
@override
State<SampleView> createState() => _SampleViewState();
}
class _SampleViewState extends State<SampleView> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(20.0),
child: Center(
child: TextField(
minLines: 1,
maxLines: 5,
inputFormatters: [CustomTextEditingFormatter()], //<--using the custom formatter here
decoration: const InputDecoration(hintText: "Type Here..."),
),
),
),
);
}
}
Класс CustomTextEditingFormatter:
import 'package:flutter/services.dart';
const String bullet = '\u2022';
class CustomTextEditingFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
String newText = "";
if (newValue.text.isNotEmpty) {
if (newValue.text.length > oldValue.text.length) {
var taskList = newValue.text.split("\n");
int cursor = 0;
for (int index = 0; index < taskList.length; index++) {
String temp = taskList[index];
if (!temp.contains(bullet)) {
temp = '$bullet $temp';
if (index == taskList.length - 1) {
cursor = cursor + 2;
} else {
cursor++;
}
}
newText = "$newText${index == 0 ? "" : "\n"}$temp";
newValue = TextEditingValue(
text: newText,
selection: TextSelection.collapsed(
offset: (newValue.selection.end + cursor)));
}
}
}
return newValue;
}
}
Выходное видео: посмотреть видео
Но я думаю, это тоже не лучший подход.
Итак, я нашел плагин под названием flutter_quill, который поддерживает множество функций редактирования, таких как маркеры, списки, контрольные списки, выделение текста и многое другое. Я собираюсь использовать это.