Вы можете использовать Random from dart:math
для генерации случайных чисел. Затем вы можете использовать виджет LayoutBuilder , чтобы узнать, сколько у вас места. Наконец, вы можете использовать виджет Positioned для позиционирования виджетов именно там, где вы хотите, в данном случае в ваших случайных координатах.
Обратите внимание, что я не знаю цель вашей случайности . Вы можете сделать это StatefulWidget и сохранить свои случайные числа между вызовами build
, чтобы при изменении вашего состояния приложения ваши случайные аватары оставались на месте. А может и нет. Выбор за вами.
введите описание изображения здесь
import 'dart:math';
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
final random = Random();
final avatarSize = 50.0;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(20.0),
child: LayoutBuilder(builder: (context, constraints) {
return Stack(
children:[
new Positioned(
left: avatarSize + (constraints.biggest.width - 2 * avatarSize ) / 100.0 * random.nextInt(100),
top: avatarSize + (constraints.biggest.height - 2 * avatarSize ) / 100.0 * random.nextInt(100),
child: new CircleAvatar(
radius: avatarSize / 2,
child: new Text('1'),
backgroundColor: Colors.yellow,
)
),
new Positioned(
left: avatarSize + (constraints.biggest.width - 2 * avatarSize ) / 100.0 * random.nextInt(100),
top: avatarSize + (constraints.biggest.height - 2 * avatarSize ) / 100.0 * random.nextInt(100),
child: new CircleAvatar(
radius: avatarSize / 2,
child: new Text('2'),
backgroundColor: Colors.red,
)
),
new Positioned(
left: avatarSize + (constraints.biggest.width - 2 * avatarSize ) / 100.0 * random.nextInt(100),
top: avatarSize + (constraints.biggest.height - 2 * avatarSize ) / 100.0 * random.nextInt(100),
child: new CircleAvatar(
radius: avatarSize / 2,
child: new Text('3'),
backgroundColor: Colors.blue,
)
),
]);
}));
}
}