在颤振中存储来自表单的信息

Posted

技术标签:

【中文标题】在颤振中存储来自表单的信息【英文标题】:Store information from forms in flutter 【发布时间】:2021-09-16 23:14:03 【问题描述】:

我是 Flutter 的初学者,我正在尝试创建一个药物追踪器应用程序。我想知道如何以类对象的形式存储用户输入。我创建了一个表单,它接受药丸的名称和时间作为复选框值 - 早上、下午、晚上和晚上。 在用户提供此信息后,我想将其存储为一个对象并将该对象存储在一个列表中。 后来我想用它来创建显示药丸名称和需要服用时间的容器。 我创建了一个单独的类。如何将用户输入存储为类对象?

这是类文件-

class MedInfo
  late String name;
  late List<bool> medTime;

  MedInfo(String n,List<bool> t)
    name=n;
    medTime=t;
  

这里是输入页面代码-

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'listItem.dart';
import 'medInfo.dart';

class MedPage extends StatefulWidget 
  @override
  _MedPageState createState()=> _MedPageState();


class _MedPageState extends State<MedPage> 

  GlobalKey<FormState> _formKey= GlobalKey<FormState>();

  List<MedInfo> items=[]; //maintains pills

  Future<MedInfo> showInformationDialog(BuildContext context) async
    return await showDialog(context: context,
        builder: (context) 
      final TextEditingController customController= TextEditingController();

      bool isMorning = false;
      bool isAfternoon= false;
      bool isEvening=false;
      bool isNight=false;
      return StatefulBuilder(builder: (context,setState)
        return AlertDialog(
          title: Text("Name of the Pill"),
          content: Form(
              key: _formKey,
              child: SingleChildScrollView( child: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  TextFormField(
                    controller: customController,
                    // validator: (value)
                    //   return value.isNotEmpty ? null : "Invalid Field";
                    // ,
                    decoration: InputDecoration(hintText: "Enter name of the medicine"),
                  ),
                  Text("Choice Box"),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [

                      Text("Morning"),

                      Checkbox(
                          //title: Text("Morning"),
                          checkColor: Colors.white,
                          //fillColor: Colors.pink,

                          value: isMorning,
                          onChanged: (bool? checked)
                            setState(()
                              isMorning = checked!;
                            );
                          ),
                        ],
                      ),
                   Row(
                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
                       children: [

                       Text("Afternoon"),

                        Checkbox(
            //title: Text("Morning"),
                            checkColor: Colors.white,
              //fillColor: Colors.pink,

                            value: isAfternoon,
                            onChanged: (bool? checked)
                              setState(()
                           isAfternoon = checked!;
                        );
                         ),
            ],
        ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [

                      Text("Evening"),

                      Checkbox(
                        //title: Text("Morning"),
                          checkColor: Colors.white,
                          //fillColor: Colors.pink,

                          value: isEvening,
                          onChanged: (bool? checked)
                            setState(()
                              isEvening = checked!;
                            );
                          ),
                    ],
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [

                      Text("Night"),

                      Checkbox(
                        //title: Text("Morning"),
                          checkColor: Colors.white,
                          //fillColor: Colors.pink,

                          value: isNight,
                          onChanged: (bool? checked)
                            setState(()
                              isNight = checked!;
                            );
                          ),
                    ],
                  ),

                ],
              )
              )
          ),
          // content: TextField(
          //   controller: customController,
          // ),
          actions: <Widget>[
            MaterialButton(
                elevation: 5.0,
                child: Text("OK"),
                onPressed: ()
                  Navigator.of(context).pop(customController.text.toString()); // to go back to screen after submitting
                
            )

          ],
        );
      );
    );
  


  @override
  Widget build(BuildContext context) 

    return Scaffold(
      appBar: AppBar(
        title: Text('My med app'),
      ),
      body: Center(

        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget> [
            Expanded(
              child: ListView.builder(
                //padding: const EdgeInsets.all(8),
                itemBuilder: (context,index)
                  return ReusableListItem(Color(0xFFd2fddf),items[index].name);
                ,
                itemCount: items.length,


              ),
            ),

          ],
        ),

      ),

      floatingActionButton: FloatingActionButton(
        onPressed: ()
          print("Clicked");
          showInformationDialog(context).then((onValue)
            print(onValue);

            setState(() 
              items.add(onValue);

            );
          );
        ,
        child: Icon(Icons.add),
      ),
    );
  
enter code here

【问题讨论】:

【参考方案1】:

TextFormField 还有一个onChanged 选项,它允许您设置一个回调,每次文本字段发生变化时都会调用该回调。

https://flutter.dev/docs/cookbook/forms/text-field-changes 检查此以获取更多详细信息。

【讨论】:

【参考方案2】:

有两种方法可以做到这一点, 我都提到了,看看什么适合你的需要:-

#1。您可以使用 onFieldSubmitted 并像这样传递回调...

TextFormField(
                decoration: InputDecoration(labelText: 'pill name'),
                validator: (value) 
                  if (value.isEmpty) 
                    return 'Please enter a name!';
                  
                ,
                onFieldSubmitted: (value) 
          
                    pillName = value;
                  
                ,
              ),

您还可以为您的表单创建一个对象,然后每次需要保存数据时只需创建一个实例并调用如下:-

 onFieldSubmitted: (value) 
                  setState(() 
                    formObject.pillName = value;
                  );
                ,

如果您想知道如何提交表单,那么您只需在表单小部件内添加一个按钮。

这是一个交互式示例 => click me to see an example

#2。如果您想在提交表单之前访问数据,那么您必须为每个字段制作 TextEditingController

和click 查看textEditingController的交互式示例。

编码愉快...

【讨论】:

以上是关于在颤振中存储来自表单的信息的主要内容,如果未能解决你的问题,请参考以下文章

在路线之间去除颤振导航

如何在 Firebase 颤振应用程序中合并两个集合?

使用颤振在 UI 中进行 POST 调用后显示来自 json 响应的特定数据

使用来自 HTML 输入表单的信息的 PayPal 付款按钮?

颤振步进器小部件 - 在各个步骤中验证字段

从 JLIST 中选择一个项目并使用来自该选定 id 的所有 db 信息更新一个表单