0

我正在使用模式格式化程序包以便使用ThousandsFormatter. 所以当我有值时10000000,它会自动显示为10.000.000。最初的代码是这样的,它按预期工作

TextFormField(     
     autofocus: false,
     autocorrect: false,
     maxLines: 1,
     textAlign: TextAlign.end,
     keyboardType: TextInputType.number,
     onChanged: (newNominal) {
         final newValue = newNominal.replaceAll(".", "");
         controller.selectedNominal = int.tryParse(newValue) ?? 0;
     },
     inputFormatters: [
         ThousandsFormatter(formatter: NumberFormat("#,###.##", "in_ID")),
     ],
),

然后我做了一些这样的按钮

在此处输入图像描述

如您所见,当我选择 $4000 时,文本字段将显示4000,我希望它会显示4.000

从按钮中选择值后,我TextEditingController用来填充文本字段中的值,所以我的 TeextField 将是这样的

final _textEditingController = TextEditingController();

TextFormField(  
     controller: _textEditingController, // I add this line   
     autofocus: false,
     autocorrect: false,
     maxLines: 1,
     textAlign: TextAlign.end,
     keyboardType: TextInputType.number,
     onChanged: (newNominal) {
         final newValue = newNominal.replaceAll(".", "");
         controller.selectedNominal = int.tryParse(newValue) ?? 0;
     },
     inputFormatters: [
         ThousandsFormatter(formatter: NumberFormat("#,###.##", "in_ID")),
     ],
),

当我点击其中一个按钮并且build会再次调用时,所以我像这样在文本字段中设置文本

@override
  Widget build(context) {

      final selectedNominal = pageController.selectedNominal.toString();
      final editingValue = TextEditingValue(
        text: selectedNominal,
        selection: TextSelection.fromPosition(
          TextPosition(offset: selectedNominal.length),
        ),
      );

      _textEditingController.value = editingValue;

    return Scaffold(
      appBar: AppBar(
        title: Text("Title here"),
      ),
      body: _buildWidgets(),
    );
  }
}

我不明白为什么ThousandsFormatter之后不再工作_textEditingController.value,即使我使用键盘输入数值,ThousandsFormatter也不起作用

标称控制器是这样的

class NominalController with ChangeNotifier {


  int _selectedNominal = 0;
  int get selectedNominal => _selectedNominal;

  set selectedNominal(int newValue) {
    _selectedNominal = newValue;
    notifyListeners();
  }

}
4

1 回答 1

0

在将字符串值分配给 textEditing 控制器之前,我必须先给出分隔符

所以我必须在将值分配给 textEditing 控制器之前“手动”设置1000010.000

final selectedNominal = pageController.selectedNominal; // 10000
var currencyFormat = NumberFormat.currency(locale: "in_ID", symbol: "");
final formattedNominal = "${currencyFormat.format(selectedNominal).replaceAll(",00", "")}"; // 10.000

            
final editingValue = TextEditingValue(
     text: formattedNominal, // 10.000
     selection: TextSelection.fromPosition(TextPosition(offset:formattedNominal.length)),
);

_textEditingController.value = editingValue;
于 2021-10-04T03:17:31.437 回答