local.dart 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. bool get isReady => true;
  32. @override
  33. Future<int> get exitCode => pty.exitCode;
  34. @override
  35. void init() {
  36. pty.init();
  37. }
  38. @override
  39. Stream<String> get out => pty.out;
  40. @override
  41. void resize(int width, int height, int pixelWidth, int pixelHeight) {
  42. pty.resize(width, height);
  43. }
  44. @override
  45. void write(String input) {
  46. pty.write(input);
  47. }
  48. @override
  49. void terminate() {
  50. // client.disconnect('terminate');
  51. }
  52. @override
  53. void ackProcessed() {
  54. // NOOP
  55. }
  56. }
  57. class LocalTerminal extends StatefulWidget {
  58. const LocalTerminal({Key? key}) : super(key: key);
  59. @override
  60. _LocalTerminalState createState() => _LocalTerminalState();
  61. }
  62. class _LocalTerminalState extends State<LocalTerminal> {
  63. final terminal = Terminal(maxLines: 10000, backend: LocalTerminalBackend());
  64. @override
  65. void initState() {
  66. super.initState();
  67. }
  68. void onInput(String input) {
  69. print('input: $input');
  70. }
  71. @override
  72. Widget build(BuildContext context) {
  73. return Scaffold(
  74. body: SafeArea(
  75. child: TerminalView(
  76. terminal: terminal,
  77. ),
  78. ),
  79. );
  80. }
  81. }