mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-06-14 22:55:12 +10:00
b34d684e67
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
40 lines
1.1 KiB
Dart
40 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();
|
|
}
|
|
}
|