import 'dart:convert'; import 'dart:io'; import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:preference_list/preference_list.dart'; import 'package:screen_capturer/screen_capturer.dart'; import 'package:path_provider/path_provider.dart'; class HomePage extends StatefulWidget { const HomePage({Key? key}) : super(key: key); @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { bool _isAccessAllowed = false; CapturedData? _lastCapturedData; String? base64Image; @override void initState() { super.initState(); _init(); } void _init() async { _isAccessAllowed = await ScreenCapturer.instance.isAccessAllowed(); setState(() {}); } void _handleClickCapture(CaptureMode mode) async { Directory directory = await getApplicationDocumentsDirectory(); String imageName = 'Screenshot-${DateTime.now().millisecondsSinceEpoch}.png'; String imagePath = '${directory.path}/screen_capturer_example/Screenshots/$imageName'; _lastCapturedData = await ScreenCapturer.instance.capture( mode: mode, imagePath: imagePath, silent: true, ); if (_lastCapturedData != null && _lastCapturedData?.imagePath != null) { base64Image = base64Encode(File(imagePath).readAsBytesSync()); final bytes = await File(_lastCapturedData?.imagePath ?? "").readAsBytes(); base64Image = base64.encode(bytes); } else { // ignore: avoid_print print('User canceled capture'); } setState(() {}); } Widget _buildBody(BuildContext context) { return PreferenceList( children: <Widget>[ if (Platform.isMacOS) PreferenceListSection( children: [ PreferenceListItem( title: const Text('isAccessAllowed'), accessoryView: Text('$_isAccessAllowed'), onTap: () async { bool allowed = await ScreenCapturer.instance.isAccessAllowed(); BotToast.showText(text: 'allowed: $allowed'); setState(() { _isAccessAllowed = allowed; }); }, ), PreferenceListItem( title: const Text('requestAccess'), onTap: () async { await ScreenCapturer.instance.requestAccess(); }, ), ], ), PreferenceListSection( title: const Text('METHODS'), children: [ PreferenceListItem( title: const Text('capture'), accessoryView: Row(children: [ CupertinoButton( child: const Text('region'), onPressed: () { _handleClickCapture(CaptureMode.region); }, ), CupertinoButton( child: const Text('screen'), onPressed: () { _handleClickCapture(CaptureMode.screen); }, ), CupertinoButton( child: const Text('window'), onPressed: () { _handleClickCapture(CaptureMode.window); }, ), ]), ), ], ), if (_lastCapturedData != null && _lastCapturedData?.imagePath != null) Column( children: [ Container( margin: const EdgeInsets.only(top: 20), width: 400, height: 400, child: Image.file( File(_lastCapturedData!.imagePath!), ), ), Container( margin: const EdgeInsets.only(top: 20), width: 400, height: 400, child: Text( base64Image!, style: TextStyle(fontSize: 10), ), ), ], ), ], ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Plugin example app'), ), body: _buildBody(context), ); } }
Flutter 图片转BASE64
48 min read