文本字段更新不适用于flutter_masked_text

时间:2019-02-28 00:46:56

标签: dart flutter maskedtextbox

我正在创建一个应用,其中一项功能是更新文本字段 基于其他文本字段的更改。

这些字段涉及以下产品的价格:美元,欧元,雷亚尔。

如果用户更改了美元价格,则欧元和实际价格也是如此,依此类推...

问题是,如果我使用正常的TextEditingController都可以正常工作,但是如果我使用flutter_masked_text包中的MoneyMaskedTextController,更新将停止。

有人可以测试我的代码并回答我为什么使用MoneyMaskedTextController停止更新吗?

要进行测试,请不要忘记在pubspec.yaml中安装flutter_masked_text:^ 0.8.0。

如果我不能使用flutter_masked_text,该如何使用掩码和更新文本字段?

谢谢。

import 'package:flutter/material.dart';
import 'package:flutter_masked_text/flutter_masked_text.dart';

void main() {
  runApp(MaterialApp(
    home: ProductType(),
  ));
}

class ProductType extends StatefulWidget {
  _ProductTypeScreen createState() => _ProductTypeScreen();
}

class _ProductTypeScreen extends State<ProductType> {

  @override
  Widget build(BuildContext context) {

    double dollarRate = 3.70;
    double euroRate = 4.20;

    //Normal controllers
/*    final ctrl_real = TextEditingController();
    final ctrl_dollar = TextEditingController();
    final ctrl_euro = TextEditingController();*/
    //Money Mask controllers
    final ctrl_real = MoneyMaskedTextController();
    final ctrl_dollar = MoneyMaskedTextController();
    final ctrl_euro = MoneyMaskedTextController();

    void change_real(String text) {
      double real = double.parse(text);
      ctrl_dollar.text = (real / dollarRate).toString();
      ctrl_euro.text = (real / euroRate).toString();
    }

    void change_dollar(String text) {
      double dolar = double.parse(text);
      ctrl_real.text = (dolar * dollarRate).toString();
      ctrl_euro.text = (dolar * dollarRate / euroRate).toString();
    }

    void change_euro(String text) {
      double euro = double.parse(text);
      ctrl_real.text = (euro * euroRate).toString();
      ctrl_dollar.text = (euro * euroRate / dollarRate).toString();
    }

    return Scaffold(
        body: SingleChildScrollView(
            child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[

                  Container(
                      width: 160.0,
                      height: 200.0,
                      padding: EdgeInsets.all(20.0),
                      child: TextField(
                        controller: ctrl_euro,
                        decoration: InputDecoration(
                            labelText: "Euro price",
                            prefixText: "€"),
                        onChanged: change_euro,
                        keyboardType: TextInputType.numberWithOptions(
                            decimal: true),
                      )),

                  Container(
                      width: 160.0,
                      height: 200.0,
                      padding: EdgeInsets.all(20.0),
                      child: TextField(
                        controller: ctrl_dollar,
                        decoration: InputDecoration(
                            labelText: "Dolar price",
                            prefixText: "US\$"),
                        onChanged: change_dollar,
                        keyboardType: TextInputType.numberWithOptions(
                            decimal: true),
                      )),

                  Container(
                      width: 160.0,
                      height: 200.0,
                      padding: EdgeInsets.all(20.0),
                      child: TextField(
                        controller: ctrl_real,
                        decoration: InputDecoration(
                            labelText: "Real price",
                            prefixText: "R\$"),
                        onChanged: change_real,
                        keyboardType: TextInputType.numberWithOptions(
                            decimal: true),
                      )),

                ]
            )
        )
    );
  }
}

1 个答案:

答案 0 :(得分:1)

如果检查每种方法收到的值,则十进制值中将出现一个逗号“,”。

void change_real(String text) {
   print("Text  : $text");
}

因此,每次您尝试解析这些值时,它都会在此处崩溃:

 double real = double.parse(text);

解决问题的一种方法是将小数分隔符更改为“。” ,就像这样:

final ctrl_real = MoneyMaskedTextController(decimalSeparator: ".");
final ctrl_dollar = MoneyMaskedTextController(decimalSeparator: ".");
final ctrl_euro = MoneyMaskedTextController(decimalSeparator: ".");