| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/services.dart'; |
| |
| class PlatformChannel extends StatefulWidget { |
| const PlatformChannel({super.key}); |
| |
| @override |
| State<PlatformChannel> createState() => _PlatformChannelState(); |
| } |
| |
| class _PlatformChannelState extends State<PlatformChannel> { |
| static const MethodChannel methodChannel = |
| MethodChannel('samples.flutter.io/battery'); |
| static const EventChannel eventChannel = |
| EventChannel('samples.flutter.io/charging'); |
| |
| String _batteryLevel = 'Battery level: unknown.'; |
| String _chargingStatus = 'Battery status: unknown.'; |
| |
| Future<void> _getBatteryLevel() async { |
| String batteryLevel; |
| try { |
| final int? result = await methodChannel.invokeMethod('getBatteryLevel'); |
| batteryLevel = 'Battery level: $result%.'; |
| } on PlatformException catch (e) { |
| if (e.code == 'NO_BATTERY') { |
| batteryLevel = 'No battery.'; |
| } else { |
| batteryLevel = 'Failed to get battery level.'; |
| } |
| } |
| setState(() { |
| _batteryLevel = batteryLevel; |
| }); |
| } |
| |
| @override |
| void initState() { |
| super.initState(); |
| eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError); |
| } |
| |
| void _onEvent(Object? event) { |
| setState(() { |
| _chargingStatus = |
| "Battery status: ${event == 'charging' ? '' : 'dis'}charging."; |
| }); |
| } |
| |
| void _onError(Object error) { |
| setState(() { |
| _chargingStatus = 'Battery status: unknown.'; |
| }); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return Material( |
| child: Column( |
| mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
| children: <Widget>[ |
| Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| Text(_batteryLevel, key: const Key('Battery level label')), |
| Padding( |
| padding: const EdgeInsets.all(16.0), |
| child: ElevatedButton( |
| onPressed: _getBatteryLevel, |
| child: const Text('Refresh'), |
| ), |
| ), |
| ], |
| ), |
| Text(_chargingStatus), |
| ], |
| ), |
| ); |
| } |
| } |
| |
| void main() { |
| runApp(const MaterialApp(home: PlatformChannel())); |
| } |