【问题标题】:Display output in textfield widget on a button a button click after calculation on a button click in Flutter在按钮上的文本字段小部件中显示输出 在 Flutter 中单击按钮计算后单击按钮
【发布时间】:2020-10-23 13:36:58
【问题描述】:

我有三个不同的小部件(文本字段),我需要一个来输入,另外两个在单击按钮后显示计算结果。在这种情况下,一个文本字段以开尔文为单位显示温度,另外两个以华氏温度和摄氏度显示结果。如果 Celcius 文本字段接受输入,则两个显示转换后的结果。请原谅我的代码可能很脏,但我是绿色的。每当在任一文本字段中完成输入时,我都会显示结果。

void main() {
  runApp(TemperatureCalculator());
}

class TemperatureCalculator extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Temperature Calculator',
      theme: ThemeData(
        primaryColor: Colors.cyanAccent,
      ),
      home: new TemperatureHome(),
    );
  }
}

class TemperatureHome extends StatefulWidget {
  @override
  createState() => TemperatureState();
}

class TemperatureState extends State<TemperatureHome> {
  String result = '';
  final temperatureMeasurer = ['Celcius', 'Kelvin', 'Farenheit'];
  double formBorders = 6.0;
  TextEditingController celciusController = TextEditingController();
  TextEditingController farenheitController = TextEditingController();
  TextEditingController kelvinController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Temperature Converter"),
        backgroundColor: Colors.deepOrange,
      ),
      body: Column(children: <Widget>[
        Padding(
            padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
            child: TextField(
              controller: celciusController,
              decoration: InputDecoration(
                  labelText: 'Temperature in Degrees Celcius',
                  hintText: 'e.g 25',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5.0))),
              keyboardType: TextInputType.number,
            )),
        Padding(
            padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
            child: TextField(
              controller: farenheitController,
              decoration: InputDecoration(
                  labelText: 'Temperature in FarenHeit',
                  hintText: 'e.g 25',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5.0))),
              keyboardType: TextInputType.number,
            )),
        Padding(
          padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
          child: TextField(
            controller: kelvinController,
            decoration: InputDecoration(
                labelText: 'Temperature in Kelvin',
                hintText: 'e.g 25',
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(5.0))),
            keyboardType: TextInputType.number,
          ),
        ),
        Row(
          children: <Widget>[
            RaisedButton(
              color: Theme.of(context).buttonColor,
              textColor: Theme.of(context).primaryColorDark,
              onPressed: () {
              setState(() {
                
              });
                  
              },
              child: Text(
                'Convert',
                textScaleFactor: 1.5,
              ),
            ),
            RaisedButton(
                color: Theme.of(context).buttonColor,
                textColor: Theme.of(context).primaryColorDark,
                child: Text(
                  'Reset',
                  textScaleFactor: 1.5,
                ),
                onPressed: () {
                  setState(() {
                    reset();
                  });
                }),
          ],
        ),
      ]),
    );
  }

  double converter() {
    double celciusTemp = double.parse(celciusController.text);
    double farenheitTemp = double.parse(farenheitController.text);
    double kelvinTemp = double.parse(kelvinController.text);

    double farenheitToCelsius = (farenheitTemp - 32) * 5 / 9;
    double farenheitToKelvin = (farenheitTemp - 32) * 5 / 9 + 273.15;
    double celciusToFarenheit = (celciusTemp * 9 / 5) + 32;
    double celsiusToKelvin = celciusTemp + 273.15;
    double kelvinToFarenheit = (kelvinTemp - 273.15) * 9 / 5 + 32;
    double kelvinToCelcius = kelvinTemp - 273.15;

    //if()
  }

  void reset() {
    celciusController.text = '';
    farenheitController.text = '';
    kelvinController.text = '';
    setState(() {
      result = '';
    });
  }
}
`

【问题讨论】:

  • 在它附近有一个单独的 textField 和一个 dropDown 让我们选择输入是开尔文、摄氏度还是华氏度不是更好吗?
  • 这是一个更好的选择。我也会探索它。

标签: flutter widget


【解决方案1】:

此解决方案可行,但您肯定需要一些代码更改,例如在转换器方法中处理 null 情况。

void main() {
  runApp(TemperatureCalculator());
}

class TemperatureCalculator extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Temperature Calculator',
      theme: ThemeData(
        primaryColor: Colors.cyanAccent,
      ),
      home: new TemperatureHome(),
    );
  }
}

class TemperatureHome extends StatefulWidget {
  @override
  createState() => TemperatureState();
}

class TemperatureState extends State<TemperatureHome> {
  String result = '';
  final temperatureMeasurer = ['Celcius', 'Kelvin', 'Farenheit'];
  double formBorders = 6.0;
  TextEditingController celciusController = TextEditingController();
  TextEditingController farenheitController = TextEditingController();
  TextEditingController kelvinController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Temperature Converter"),
        backgroundColor: Colors.deepOrange,
      ),
      body: Column(children: <Widget>[
        Padding(
            padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
            child: TextField(
              controller: celciusController,
              decoration: InputDecoration(
                  labelText: 'Temperature in Degrees Celcius',
                  hintText: 'e.g 25',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5.0))),
              keyboardType: TextInputType.number,
            )),
        Padding(
            padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
            child: TextField(
              controller: farenheitController,
              decoration: InputDecoration(
                  labelText: 'Temperature in FarenHeit',
                  hintText: 'e.g 25',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5.0))),
              keyboardType: TextInputType.number,
            )),
        Padding(
          padding: EdgeInsets.only(top: formBorders, bottom: formBorders),
          child: TextField(
            controller: kelvinController,
            decoration: InputDecoration(
                labelText: 'Temperature in Kelvin',
                hintText: 'e.g 25',
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(5.0))),
            keyboardType: TextInputType.number,
          ),
        ),
        Row(
          children: <Widget>[
            RaisedButton(
              color: Theme.of(context).buttonColor,
              textColor: Theme.of(context).primaryColorDark,
              onPressed: () {
                setState((){
                  converter();    
                });
              
                  
              },
              child: Text(
                'Convert',
                textScaleFactor: 1.5,
              ),
            ),
            RaisedButton(
                color: Theme.of(context).buttonColor,
                textColor: Theme.of(context).primaryColorDark,
                child: Text(
                  'Reset',
                  textScaleFactor: 1.5,
                ),
                onPressed: () {
                  setState(() {
                    reset();
                  });
                }),
          ],
        ),
      ]),
    );
  }

  void converter() {
    double celciusTemp = double.tryParse(celciusController.text);
    double farenheitTemp = double.tryParse(farenheitController.text);
    double kelvinTemp = double.tryParse(kelvinController.text);

    double farenheitToCelsius = ((farenheitTemp ?? 0) - 32) * 5 / 9;
    double farenheitToKelvin = ((farenheitTemp ?? 0) - 32) * 5 / 9 + 273.15;
    double celciusToFarenheit = ((celciusTemp ?? 0) * 9 / 5) + 32;
    double celsiusToKelvin = (celciusTemp ?? 0) + 273.15;
    double kelvinToFarenheit = ((kelvinTemp ?? 0) - 273.15) * 9 / 5 + 32;
    double kelvinToCelcius = (kelvinTemp ?? 0) - 273.15;
    
    if(celciusController.text.isNotEmpty 
       && double.tryParse(celciusController.text) != null){
     
        farenheitController.text = celciusToFarenheit.toString();
        kelvinController.text = celsiusToKelvin.toString();
      
    }else if(farenheitController.text.isNotEmpty 
       && double.tryParse(farenheitController.text) != null){
      celciusController.text = farenheitToCelsius.toString();
      kelvinController.text = farenheitToKelvin.toString();
    }else if(kelvinController.text.isNotEmpty 
       && double.tryParse(kelvinController.text) != null){
      celciusController.text = kelvinToCelcius.toString();
      farenheitController.text = kelvinToFarenheit.toString();
    }

    //if()
  }

  void reset() {
    celciusController.text = '';
    farenheitController.text = '';
    kelvinController.text = '';
    setState(() {
      result = '';
    });
  }
}

【讨论】:

    【解决方案2】:

    这行得通吗:

    if (celciusController.text != null && celciusController.text.length > 0) {
      farenheitController.text = (int.parse(celciusController.text)* 9 / 5) + 32;
      kelvinController.text = int.parse(celciusController.text)+ 273.15;
    } 
    else if (farenheitController.text != null && farenheitController.text.length > 0) {
      celciusController.text = (int.parse(farenheitController.text)- 32) * 5 / 9;
      kelvinController.text = (int.parse(farenheitController.text)- 32) * 5 / 9 + 273.15;
    }
    else{
      ....
    }
    

    这行得通吗?

    【讨论】:

      【解决方案3】:

      您可以在 initState() 中将侦听器添加到文本控制器。解决方法的一个简单示例如下所示:

        @override
        void dispose() {        
          celciusController.dispose();
          farenheitController.dispose();
          kelvinController.dispose();
          super.dispose();
        }
      
        @override
        void initState() {
          celciusController.addListener((){
              
              setState(() {
                        converter();
                      });
          });
          farenheitController.addListener((){
              
              setState(() {
                        converter();
                      });
          });
          kelvinController.addListener((){
              
              setState(() {
                        converter();
                      });
          });
      
          super.initState();
        }
      

      阅读更多来自official document

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-30
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多