【问题标题】:Flutter: problem to get a calculation of several values ​of different textfieldFlutter:计算不同文本字段的几个值的问题
【发布时间】:2021-03-23 07:20:18
【问题描述】:

我需要帮助解决问题。 我正在尝试检索一个值,该值是添加多个文本字段值的结果,以便能够在另一个屏幕中使用它(通过 sharedpreferencies 或 sqlite)......我似乎无法得到这个值(在我的示例中为“总值”)。 谁有我的方法?

import 'package:flutter/material.dart';

class Screen1 extends StatefulWidget {
  Screen1({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _Screen1State createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {

  final myController1 = TextEditingController();
  final myController2 = TextEditingController();


  @override
  void dispose() {
    myController1.dispose();
    myController2.dispose();
    super.dispose();
  }
  double value1;
  double value2;
  //double totalvalues = value1 + value2;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Screen 1'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: myController1,
                    keyboardType: TextInputType.number,
                    onChanged: (val) {
                      setState(() {
                        value1 = double.parse(myController1.text) * 10;
                      });
                    },
                    decoration: InputDecoration(
                        hintText: '0'
                    ),
                  ),
                ),
                Expanded(
                    child: Center(
                        child: value1 != null
                            ? Text(value1.toStringAsFixed(0))
                            : Text('0')
                    )
                ),
              ],
            ),
            Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: myController2,
                    keyboardType: TextInputType.number,
                    onChanged: (val) {
                      setState(() {
                        value2 = double.parse(myController2.text) * 5;
                      });
                    },
                    decoration: InputDecoration(
                        hintText: '0'
                    ),
                  ),
                ),
                Expanded(
                    child: Center(
                        child: value2 != null
                            ? Text(value2.toStringAsFixed(0))
                            : Text('0')
                    )
                ),
              ],
            ),
            Center(
              child: Text('totalvalues = value1 + value2'),
            ),
            Center(
                child: ElevatedButton(
                    onPressed: () {
                      print('$value1');
                      print('$value2');
                      myController1.clear();
                      myController2.clear();

                    },
                    child: Text('Next screen >')
                )
            )
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

  • 仅当您在未来的会话中也需要该数据时才使用 shared_pref 或 sqflite。否则,您可以简单地创建一个名为 data 的类并在其中添加一个静态变量。假设变量名为“additionData”,那么无论何时你想设置或编辑数据,你都可以调用:Data.additionData = 1;然后您可以以相同的方式获取数据:打印(Data.additionData)。您可以在代码中的任何位置使用此静态变量。

标签: flutter texteditingcontroller


【解决方案1】:

这里的问题是你必须在每次值改变时重新计算totalvalue

先声明变量而不初始化:

double totalvalues;

其次,在每个onChanged函数上,重新计算值:

对于value1

onChanged: (val) {
    setState(() {
        value1 = double.parse(myController1.text) * 10;
        totalvalues = value1 + value2;
    });
},

对于value2

onChanged: (val) {
    setState(() {
        value2 = double.parse(myController2.text) * 10;
        totalvalues = value1 + value2;
    });
},

然后,您将在每次更改输入时更新总价值并将其显示在您的文本中,如下所示:

Text('$value1 + $value2 = $totalvalues')

如果您希望有两个以上的值,或者totalvalue 的计算方式可以改变,我建议您将重新计算转移到一个函数中。

【讨论】:

    【解决方案2】:

    对于你的情况,你甚至不TextEditingController

    class _Screen1State extends State<Screen1> {
    
     // final myController1 = TextEditingController();
     // final myController2 = TextEditingController();
    
    
      @override
      void dispose() {
       // myController1.dispose();
       // myController2.dispose();
        super.dispose();
      }
      double value1;
      double value2;
      //double totalvalues = value1 + value2;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Screen 1'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                Row(
                  children: [
                    Expanded(
                      child: TextField(
                        // controller: myController1,
                        keyboardType: TextInputType.number,
                        onChanged: (val) {
                          setState(() {
                            //value1 = double.parse(myController1.text) * 10;
                            value1 = double.parse(val) * 10;
                          });
                        },
                        decoration: InputDecoration(
                            hintText: '0'
                        ),
                      ),
                    ),
                    Expanded(
                        child: Center(
                            child: value1 != null
                                ? Text(value1.toStringAsFixed(0))
                                : Text('0')
                        )
                    ),
                  ],
                ),
                Row(
                  children: [
                    Expanded(
                      child: TextField(
                        // controller: myController2,
                        keyboardType: TextInputType.number,
                        onChanged: (val) {
                          setState(() {
                            // value2 = double.parse(myController2.text) * 5;
                            value2 = double.parse(val) * 5;
    
                          });
                        },
                        decoration: InputDecoration(
                            hintText: '0'
                        ),
                      ),
                    ),
                    Expanded(
                        child: Center(
                            child: value2 != null
                                ? Text(value2.toStringAsFixed(0))
                                : Text('0')
                        )
                    ),
                  ],
                ),
                Center(
                  child: Text('totalvalues = ${value1 + value2}'),
                ),
                Center(
                    child: ElevatedButton(
                        onPressed: () {
                          print('$value1');
                          print('$value2');
                          // myController1.clear();
                          // myController2.clear();
                          value1=0;
                          value2=0;
                        },
                        child: Text('Next screen >')
                    )
                )
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 感谢您的关注。 Sam Chan:这段代码是试用版,我正在使用 TextEditingController 让我可以选择在最终版本中执行 controller.clean()。
    • Brugui:你的方法有效,我觉得必须对每个 TextField 进行此计算,因为对于我的最终版本,最多有 8 个 TextField,我只想“存储”结果在保存到 SQFLite 数据库之前显示在最后一个屏幕上......但它可以工作。
    • Sarvech Dalvi:我问自己一个问题,即在共享首选项中进行备份,以便在保存到 sqflite 数据库之前在我的最后一个屏幕上显示此结果。我还查看了提供程序和 BLoc,但目前这超出了我的技能范围。我将研究你的方法来控制它。感谢您的宝贵建议和经验。
    • 我把代码换成了totalvalues=value1+value2;通过方法:void totalScreen1(){totalvalues=value1+value2; } 在我的 StatefulWidget 中(对我来说看起来更好?),我只需要存储结果就可以在我的最后一个屏幕上使用它......
    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多