Получить позицию последнего отрисованного в TextPainter символа в исходной строке
Пишу читалку электронных книг на Flutter и задумка такая. Есть метод, который генерирует вкладки. На первой вкладке через TextPainter я рисую текст на весь body Scaffold'а, а дальше хочу получить позицию последнего отрисованного символа чтобы на следующей вкладке начать рисовать уже с него, но не могу понять как это сделать. Гуглеж ничего не дал, прошу помощи.
Я немного поэксперементировал сегодня и понял, что на страницу влазает не только то, что я вижу, но и еще немного вниз. Как будто скаффолда не существует и оно старается занять весь экран. У TextPaint есть метод getPositionForOffset, но вообще не понятно что это, зачем и что оно делает. А вот из TextSpan можно получить текст. Конечно, не понятно полный ли текст видно в консоли vscode, но тем не менее... Стоит попробовать запустить из другого эмулятора терминала.
Вот код (из сторонних библиотек тут используется Dio):
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
class ReaderPage extends StatefulWidget {
ReaderPageState createState() => ReaderPageState();
}
class ReaderPageState extends State<ReaderPage> {
@override
Widget build(BuildContext context) {
//getText();
return Scaffold(
appBar: AppBar(),
body: Container(
padding: EdgeInsets.fromLTRB(10, 2, 10, 50),
child: FutureBuilder<String>(
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Container(child:
CustomPaint(
size: Size(double.infinity, double.infinity),
painter: PageTextPainter(snapshot.data),
));
}
return CircularProgressIndicator();
},
future: getText(),
)));
}
Future<String> getText() async {
var response = await Dio().get(
'https://ranobelib.ru/bozhestvenniy-mech-haosa/glava-78-krovavaya-pobeda/');
return response.data;
}
}
class PageTextPainter extends CustomPainter {
String data;
PageTextPainter(this.data);
@override
void paint(Canvas canvas, Size size) {
final textStyle = TextStyle(
color: Colors.black,
fontSize: 38,
);
final textSpan = TextSpan(
text: data,
style: textStyle,
);
final textPainter = TextPainter(
text: textSpan,
textDirection: TextDirection.ltr,
);
textPainter.layout(
minWidth: 0,
maxWidth: size.width,
);
final offset = Offset(0, 0);
textPainter.paint(canvas, offset);
print("startText" + textSpan.text + "endText");
}
@override
bool shouldRepaint(CustomPainter old) {
return false;
}
}