isolate.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:xterm/flutter.dart';
  4. import 'package:xterm/isolate.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: MyHomePage(),
  19. );
  20. }
  21. }
  22. class MyHomePage extends StatefulWidget {
  23. MyHomePage({Key key}) : super(key: key);
  24. @override
  25. _MyHomePageState createState() => _MyHomePageState();
  26. }
  27. class FakeTerminalBackend extends TerminalBackend {
  28. Completer<int> _exitCodeCompleter = Completer<int>();
  29. // ignore: close_sinks
  30. StreamController<String> _outStream = StreamController<String>();
  31. @override
  32. Future<int> get exitCode => _exitCodeCompleter.future;
  33. @override
  34. void init() {
  35. _exitCodeCompleter = Completer<int>();
  36. _outStream = StreamController<String>();
  37. _outStream.sink.add('xterm.dart demo');
  38. _outStream.sink.add('\r\n');
  39. _outStream.sink.add('\$ ');
  40. }
  41. @override
  42. Stream<String> get out => _outStream.stream;
  43. @override
  44. void resize(int width, int height, int pixelWidth, int pixelHeight) {
  45. // NOOP
  46. }
  47. @override
  48. void write(String input) {
  49. if (input.length <= 0) {
  50. return;
  51. }
  52. // in a "real" terminal emulation you would connect onInput to the backend
  53. // (like a pty or ssh connection) that then handles the changes in the
  54. // terminal.
  55. // As we don't have a connected backend here we simulate the changes by
  56. // directly writing to the terminal.
  57. if (input == '\r') {
  58. _outStream.sink.add('\r\n');
  59. _outStream.sink.add('\$ ');
  60. } else if (input.codeUnitAt(0) == 127) {
  61. // Backspace handling
  62. _outStream.sink.add('\b \b');
  63. } else {
  64. _outStream.sink.add(input);
  65. }
  66. }
  67. @override
  68. void terminate() {
  69. //NOOP
  70. }
  71. @override
  72. void ackProcessed() {
  73. //NOOP
  74. }
  75. }
  76. class _MyHomePageState extends State<MyHomePage> {
  77. TerminalIsolate terminal = TerminalIsolate(
  78. backend: FakeTerminalBackend(),
  79. maxLines: 10000,
  80. );
  81. @override
  82. void initState() {
  83. super.initState();
  84. terminal.start();
  85. }
  86. void onInput(String input) {}
  87. @override
  88. Widget build(BuildContext context) {
  89. return Scaffold(
  90. body: SafeArea(
  91. child: TerminalView(terminal: terminal),
  92. ),
  93. );
  94. }
  95. }