screen_retriever 0.3.0
screen_retriever: ^0.3.0 copied to clipboard
This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc.
// The example shows the deprecated 0.2.x compatible API on purpose.
// ignore_for_file: deprecated_member_use
import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart';
import 'package:screen_retriever/legacy.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
builder: BotToastInit(),
navigatorObservers: [BotToastNavigatorObserver()],
home: const HomePage(),
);
}
}
class _ListSection extends StatelessWidget {
const _ListSection({required this.title, required this.children});
final Widget title;
final List<Widget> children;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(left: 20, top: 12, bottom: 6),
child: DefaultTextStyle(
style: Theme.of(context).textTheme.titleMedium ?? const TextStyle(),
child: title,
),
),
...children,
],
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with ScreenListener {
Display? _primaryDisplay;
List<Display> _displayList = [];
@override
void initState() {
screenRetriever.addListener(this);
super.initState();
_getDisplays();
}
@override
void dispose() {
screenRetriever.removeListener(this);
super.dispose();
}
@override
void onScreenEvent(String eventName) {
BotToast.showText(text: 'onScreenEvent: $eventName');
_getDisplays();
}
Future<void> _getDisplays() async {
_primaryDisplay = await screenRetriever.getPrimaryDisplay();
_displayList = await screenRetriever.getAllDisplays();
setState(() {});
}
Future<void> _handleGetCursorScreenPoint() async {
Offset point = await screenRetriever.getCursorScreenPoint();
BotToast.showText(text: 'cursorScreenPoint: $point');
}
Widget _buildPrimaryDisplay(BuildContext context) {
if (_primaryDisplay != null) {
return _ListSection(
title: const Text('Primary Display'),
children: [DisplayCard(_primaryDisplay!)],
);
}
return const SizedBox();
}
Widget _buildAllDisplays(BuildContext context) {
if (_displayList.isNotEmpty) {
return _ListSection(
title: const Text('All Displays'),
children: [for (var display in _displayList) DisplayCard(display)],
);
}
return const SizedBox();
}
Widget _buildMethods(BuildContext context) {
return _ListSection(
title: const Text('Methods'),
children: [
Card(
child: ListTile(
title: const Text('getCursorScreenPoint'),
onTap: _handleGetCursorScreenPoint,
),
),
Card(
child: ListTile(
title: const Text('getPrimaryDisplay'),
onTap: () async {
_primaryDisplay = await screenRetriever.getPrimaryDisplay();
setState(() {});
BotToast.showText(
text: 'primaryDisplay: ${_primaryDisplay!.toJson()}',
);
},
),
),
Card(
child: ListTile(
title: const Text('getAllDisplays'),
onTap: () async {
_displayList = await screenRetriever.getAllDisplays();
setState(() {});
BotToast.showText(
text:
'allDisplays:\n${_displayList.map((e) => e.toJson()).join('\n')}',
);
},
),
),
],
);
}
Widget _buildBody(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(16),
children: <Widget>[
_buildPrimaryDisplay(context),
_buildAllDisplays(context),
_buildMethods(context),
],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Screen Retriever Example')),
body: _buildBody(context),
);
}
}
class DisplayCard extends StatelessWidget {
const DisplayCard(this.display, {super.key});
final Display display;
@override
Widget build(BuildContext context) {
return Card(
child: ListTile(
title: Text('${display.name}'),
subtitle: Text(
[
'id: ${display.id}',
'size: ${display.size}',
'visiblePosition: ${display.visiblePosition}',
'visibleSize: ${display.visibleSize}',
'scaleFactor: ${display.scaleFactor}',
].join('\n'),
),
onTap: () {
BotToast.showText(text: '${display.toJson()}');
},
),
);
}
}