Terminal Library for dart and flutter support cross platform with user friendly, so this will help you to integrated terminal to your app without any hastle
- Documentation
- Youtube
- Telegram Support Group
- Contact Developer (check social media or readme profile github)
- 📱️ Cross Platform support (Device)
- 📜️ Standarization Style Code
- ⌨️ Cli (Terminal for help you use this library or create project)
- 🔥️ Api (If you developer bot / userbot you can use this library without interact cli just add library and use 🚀️)
- 🧩️ Customizable Extension (if you want add extension so you can more speed up on development)
- ✨️ Pretty Information (user friendly for newbie)
- 🔥️ Multi Function One library with multi function (INCLUDE SSH CLIENT) so you can connect ssh terminal or acces file using SFTP without any hastle
This library work on everywhere platform (cli, server, web, gui) ignore flutter flag only pub.dev
I Really need energy for make this library easy to use please help me like
- Dart
dart pub add terminal_library
- Flutter
flutter pub add terminal_library
- General Studio Developer App
General Studio Developer App Is Application code editor with cross platform support with extra feature native (SSH CLIENT, CHROOT LINUX, HTTP CLIENT, NETWORK PROXY) so this app is can help you to develop without use more one app so you will significant decrease ram usage
-
General Bot App / General Automation App
-
General Application
Example Quickstart script minimal for insight you or make you use this library because very simple
// ignore_for_file: empty_catches, non_constant_identifier_names
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:general_lib/general_lib.dart';
import 'package:general_lib_flutter/extension/build_context.dart';
import 'package:general_lib_flutter/widget/widget.dart';
import 'package:terminal_library/pty_library/pty_library.dart';
import 'package:terminal_library/xterm_library/xterm.dart';
void main(List<String> args) {
WidgetsFlutterBinding.ensureInitialized();
runApp(const App());
}
class App extends StatelessWidget {
static GeneralLibFlutterApp generalLibFlutterApp = GeneralLibFlutterApp();
const App({super.key});
@override
Widget build(BuildContext context) {
return GeneralLibFlutterAppMain(
generalLibFlutterApp: generalLibFlutterApp,
builder: (themeMode, lightTheme, darkTheme, widget) {
Widget child = MaterialApp(
theme: lightTheme,
darkTheme: darkTheme,
themeMode: themeMode,
debugShowCheckedModeBanner: false,
home: const MyApp(),
);
return child;
},
);
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
TerminalLibraryFlutterController terminalLibraryFlutterController = TerminalLibraryFlutterController();
// TerminalLibraryFlutterInputHandler terminalLibraryFlutterInputHandler = TerminalLibraryFlutterInputHandler;
final TerminalLibraryFlutter terminalLibraryFlutter = TerminalLibraryFlutter(
maxLines: 1000,
// inputHandler:
);
late final PtyLibrary ptyLibrary;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
await refresh();
});
}
@override
void dispose() {
ptyLibrary.kill();
terminalLibraryFlutterController.dispose();
super.dispose();
}
bool is_loading = false;
Future<void> refresh() async {
if (is_loading) {
return;
}
setState(() {
is_loading = true;
});
await Future(() async {
await Future.delayed(Durations.short1);
ptyLibrary = PtyLibrary.start(
shell,
columns: terminalLibraryFlutter.viewWidth,
rows: terminalLibraryFlutter.viewHeight,
);
ptyLibrary.output.listen((event) {
if (event.isNotEmpty) {
try {
terminalLibraryFlutter.write(utf8.decode(event, allowMalformed: true));
} catch (e) {}
}
});
terminalLibraryFlutter.onOutput = (String value) {
if (value.isNotEmpty) {
try {
ptyLibrary.write(utf8.encode(value));
} catch (e) {}
}
};
terminalLibraryFlutter.onResize = (w, h, pw, ph) {
ptyLibrary.resize(h, w);
};
terminalLibraryFlutter.buffer.clear();
terminalLibraryFlutter.buffer.setCursor(0, 0);
terminalLibraryFlutter.textInput("clear");
terminalLibraryFlutter.keyInput(TerminalLibraryFlutterKey.enter);
setState(() {});
});
setState(() {
is_loading = false;
});
}
@override
Widget build(BuildContext context) {
if (is_loading) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(
color: context.theme.indicatorColor,
),
),
);
}
return Scaffold(
appBar: AppBar(
title: const Text("Terminal Library:"),
),
body: TerminalLibraryFlutterViewWidget(
terminalLibraryFlutter,
controller: terminalLibraryFlutterController,
autofocus: true,
backgroundOpacity: 0,
simulateScroll: true,
padding: const EdgeInsets.all(5),
alwaysShowCursor: true,
deleteDetection: Dart.isMobile,
),
);
}
static String get shell {
if (Platform.isMacOS || Platform.isLinux) {
return Platform.environment['SHELL'] ?? 'bash';
}
if (Platform.isWindows) {
return 'cmd.exe';
}
return 'sh';
}
}