Обновление текстового поля не работает с flutter_masked_text - PullRequest
0 голосов
/ 28 февраля 2019

Я создаю приложение, в котором одной из функций является обновление текстовых полей на основе изменений других текстовых полей.

В полях указаны цены на товары в: долларах, евро, реальных.

Если цена в долларах изменяется пользователем, евро и реальная цена тоже, и так далее ...

Проблема в том, что, если я использую обычный TextEditingController, все работает хорошо, но если яиспользуйте MoneyMaskedTextController из пакета flutter_masked_text, обновление останавливается.

Может ли кто-нибудь протестировать мой код и ответить, почему прекращается обновление с помощью MoneyMaskedTextController?

Для проверки,не забудьте установить flutter_masked_text: ^ 0.8.0 в вашем pubspec.yaml.

Если я не могу использовать для этого 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 голосов
/ 28 февраля 2019

Если вы проверите значение, полученное по каждому методу, вы увидите запятую "," в десятичных значениях.

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

, поэтому каждый раз, когда вы пытаетесь проанализировать эти значения, происходит сбой здесь:

 double real = double.parse(text);

Один из способов решения вашей проблемы - изменить decimalSeparator на '.', вот так:

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