Flutter. Доработка кода с двумя ListView.builder.
Flutter. Задачи:
1. ListView.builder:
1.1. Сделать чтобы при движении пальца по смартфону (Андроид) горизонтальные ListView.builder-ы прокручивались по горизонтали вместе (как один ListView.builder, как одна строка).
Как результат при движении пальцем по экрану в любую сторону весь массив должен
смещаться за пальцем и при свайпе (быстром движении пальцем по экрану с отрывом
в конце) в любом направлении должно прокручиваться как при ListView.builder.
1.2. Вывести в переменные (например, listBilderX и listBilderY, или в одну Offset listBilder) текущие горизонтальное и вертикальное смещения ListView.builder.
2. В коде ниже если тапнуть пальцем по смартфону и провести по горизонтали, то за
пальцем начнёт двигаться горизонтальный ListView.builder (один из). Если, не
отрывая первый палец, тапнуть по смартфону вторым пальцем и начать двигать им
уже вертикально, то начнёт двигаться уже вертикально весь массив. Следовательно,
прога видит два пальца и их движения.
Задача использовать движение двух пальцев для изменения размера квадрата/ячейки,
сохраняя при этом возможность двигать/свайпать массив на экране (без включения
другого режима в моб. приложении).
3. Желательно/по возможности ускорить работу кода в 2 и более раз (при макс. массиве до
1000х1000). Указать в ответе возможность этого пункта и примерно во сколько
можно ускорить.
Комменты в коде не нужны. В качестве выполненной задачи мне хватит только отредактированного листинга (т.е. установщик/apk не нужен).
Совет - проверять работу кода на реальном устройстве.
В приатаченном файле заготовка кода.
Просьба озвучить сумму и примерные сроки.
---------------------------------
import 'package:flutter/material.dart';
import 'package:rnd/rnd.dart';
import 'dart:math';
final rnd = Random();
List users = List.generate(1000, (j) => List.generate(1000, (i) => '$j\n$i'));
var cellMark =
List.generate(1000, (j) => List.generate(1000, (i) => rnd(2).toInt()));
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'list_bilder_1',
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
MyHomePageState createState() => MyHomePageState();
}
class MyHomePageState extends State {
double squareSize = 40;
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
scrollDirection: Axis.vertical,
itemCount: users.length,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
width: squareSize + 1.0,
height: squareSize + 1.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: users.length,
itemBuilder: (BuildContext context, int indexF) {
return Container(
width: squareSize,
height: squareSize,
margin: const EdgeInsets.all(0.5),
color: cellMark[index][indexF] == 0
? Colors.yellow
: Colors.blueAccent,
child: Center(
child: Text(
users[index][indexF],
textAlign: TextAlign.center,
),
),
);
},
),
);
},
),
);
}
}