草庐IT

dart - 文本字段更新不适用于 flutter_masked_text

coder 2023-07-24 原文

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

这些字段是关于产品价格的:美元、欧元、雷亚尔。

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

问题是,如果我使用普通的 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),
                      )),

                ]
            )
        )
    );
  }
}

最佳答案

如果您检查每个方法收到的值,您会在十进制值中看到一个逗号“,”。

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: ".");

关于dart - 文本字段更新不适用于 flutter_masked_text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54916723/

有关dart - 文本字段更新不适用于 flutter_masked_text的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  8. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

随机推荐