local.dart 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:pty/pty.dart';
  4. import 'package:xterm/flutter.dart';
  5. import 'package:xterm/xterm.dart';
  6. void main() {
  7. runApp(MyApp());
  8. }
  9. class MyApp extends StatelessWidget {
  10. @override
  11. Widget build(BuildContext context) {
  12. return MaterialApp(
  13. title: 'xterm.dart demo',
  14. theme: ThemeData(
  15. primarySwatch: Colors.blue,
  16. visualDensity: VisualDensity.adaptivePlatformDensity,
  17. ),
  18. home: LocalTerminal(),
  19. );
  20. }
  21. }
  22. class LocalTerminalBackend extends TerminalBackend {
  23. LocalTerminalBackend();
  24. final pty = PseudoTerminal.start(
  25. '/system/bin/sh',
  26. [],
  27. blocking: false,
  28. environment: Platform.environment,
  29. );
  30. @override
  31. Future<int> get exitCode => pty.exitCode;
  32. @override
  33. void init() {
  34. pty.init();
  35. }
  36. @override
  37. Stream<String> get out => pty.out;
  38. @override
  39. void resize(int width, int height, int pixelWidth, int pixelHeight) {
  40. pty.resize(width, height);
  41. }
  42. @override
  43. void write(String input) {
  44. pty.write(input);
  45. }
  46. @override
  47. void terminate() {
  48. // client.disconnect('terminate');
  49. }
  50. @override
  51. void ackProcessed() {
  52. // NOOP
  53. }
  54. }
  55. class LocalTerminal extends StatefulWidget {
  56. const LocalTerminal({Key? key}) : super(key: key);
  57. @override
  58. _LocalTerminalState createState() => _LocalTerminalState();
  59. }
  60. class _LocalTerminalState extends State<LocalTerminal> {
  61. final terminal = Terminal(maxLines: 10000, backend: LocalTerminalBackend());
  62. @override
  63. void initState() {
  64. super.initState();
  65. }
  66. void onInput(String input) {
  67. print('input: $input');
  68. }
  69. @override
  70. Widget build(BuildContext context) {
  71. return Scaffold(
  72. body: SafeArea(
  73. child: TerminalView(
  74. terminal: terminal,
  75. ),
  76. ),
  77. );
  78. }
  79. }