mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-04-20 22:13:48 +00:00
formats all dart files using `dart format .` from the root project dir this makes the code style repeatable by new contributors and makes PR review easier
39 lines
1.1 KiB
Dart
39 lines
1.1 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
class Utf8LengthLimitingTextInputFormatter extends TextInputFormatter {
|
|
final int maxBytes;
|
|
|
|
const Utf8LengthLimitingTextInputFormatter(this.maxBytes);
|
|
|
|
@override
|
|
TextEditingValue formatEditUpdate(
|
|
TextEditingValue oldValue,
|
|
TextEditingValue newValue,
|
|
) {
|
|
if (maxBytes <= 0) return oldValue;
|
|
final bytes = utf8.encode(newValue.text);
|
|
if (bytes.length <= maxBytes) return newValue;
|
|
|
|
final truncated = _truncateToMaxBytes(newValue.text, maxBytes);
|
|
return TextEditingValue(
|
|
text: truncated,
|
|
selection: TextSelection.collapsed(offset: truncated.length),
|
|
composing: TextRange.empty,
|
|
);
|
|
}
|
|
|
|
String _truncateToMaxBytes(String text, int limit) {
|
|
final buffer = StringBuffer();
|
|
var used = 0;
|
|
for (final rune in text.runes) {
|
|
final char = String.fromCharCode(rune);
|
|
final charBytes = utf8.encode(char).length;
|
|
if (used + charBytes > limit) break;
|
|
buffer.write(char);
|
|
used += charBytes;
|
|
}
|
|
return buffer.toString();
|
|
}
|
|
}
|