Flutter 函数能否接受颤振/省道语言中的两个值?如果是,比如何?

Flutter 函数能否接受颤振/省道语言中的两个值?如果是,比如何?,flutter,dart,Flutter,Dart,假设我有一个具有登录功能的应用程序,有两个文本输入字段Username和Password。还有一个叫做登录的按钮。现在,若用户输入用户名和密码并点击登录按钮,那个么应用程序会将他/她导航到下一个页面,比如账户页面。但如果用户按下登录按钮,其中任何一个或两个字段都为空,则工具提示将被调用,如“用户名和密码不能为空”…因此我认为登录按钮将调用一个函数(按下时),该函数需要两个值username和password,如果该值为空,则调用工具提示,否则导航到下一页。。。 嗯,我是编程新手,所以可能我的整个

假设我有一个具有登录功能的应用程序,有两个文本输入字段Username和Password。还有一个叫做登录的按钮。现在,若用户输入用户名和密码并点击登录按钮,那个么应用程序会将他/她导航到下一个页面,比如账户页面。但如果用户按下登录按钮,其中任何一个或两个字段都为空,则工具提示将被调用,如“用户名和密码不能为空”…因此我认为登录按钮将调用一个函数(按下时),该函数需要两个值username和password,如果该值为空,则调用工具提示,否则导航到下一页。。。 嗯,我是编程新手,所以可能我的整个逻辑都是错误的,如果逻辑是正确的,那么我该怎么办

这是我的密码

import 'package:flutter/material.dart';
import 'package:login_signup/accountpage.dart';

void main(List<String> args) {
  runApp(logsign());
}

class logsign extends StatefulWidget {
  @override
  _logsignState createState() => _logsignState();
}

class _logsignState extends State<logsign> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/account': (context) => AccountPage(),
      },
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      title: "logsignApp",
      home: homepage(),
    );
  }
}

class homepage extends StatefulWidget {
  @override
  _homepageState createState() => _homepageState();
}

class _homepageState extends State<homepage> {

  String usrname;
  String passwd;

  void detailsmust (String usrname, passwd){
    if (usrname == "" || passwd == ""){
      Tooltip(message: "Username & Password field cant be empty");
    }
    else{
      Navigator.pushNamed(context, '/account')
    }
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Login/Signup"),
      ),
      drawer: Text("Just a drawer", textScaleFactor: 2.0),
      body:
       Column(
         mainAxisAlignment: MainAxisAlignment.center,
         children: [
           TextField(
             onChanged: (text){
               usrname = text;
             },
             maxLength: 30,
             decoration: InputDecoration(
               prefixIcon: Icon(Icons.account_box),
               labelText: 'Username',
               border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.0)),
             ),
           ),
            // Padding(
            //   padding: EdgeInsets.all(2.0),
            // ),
           TextField(
             onChanged: (text){
               passwd = text;
             },
             obscureText: true,
             decoration: InputDecoration(
               prefixIcon: Icon(Icons.lock_outline),
               labelText: 'Password',
               border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.0)),
             ),
           ),
           Row(
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               MaterialButton(
              onPressed: detailsmust,
             child: Text("Login"),
             color: Colors.green,
             shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
           ),
           Padding(
             padding: EdgeInsets.all(5.0),
           ),
           MaterialButton(
             onPressed: (){},
             child: Text("Exit"),
             color: Colors.green,
             shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
           ),
             ],
           ),
         ],
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:登录\注册/accountpage.dart”;
void main(列表参数){
runApp(logsign());
}
类logsign扩展StatefulWidget{
@凌驾
_logsignState createState();
}
类_logsignState扩展状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
路线:{
“/account”:(上下文)=>AccountPage(),
},
主题:主题数据(
主样本:颜色。绿色,
),
标题:“logsignApp”,
主页:主页(),
);
}
}
类主页扩展了StatefulWidget{
@凌驾
_homepageState createState()=>\u homepageState();
}
类_homepageState扩展状态{
字符串usrname;
字符串密码;
void detailsmost(字符串usrname,passwd){
if(usrname==“”| | passwd==“”){
工具提示(消息:“用户名和密码字段不能为空”);
}
否则{
Navigator.pushNamed(上下文“/account”)
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“登录/注册”),
),
抽屉:文本(“只是一个抽屉”,textScaleFactor:2.0),
正文:
纵队(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本字段(
一旦更改:(文本){
usrname=文本;
},
最大长度:30,
装饰:输入装饰(
前缀:图标(图标。帐户框),
labelText:'用户名',
边框:大纲输入边框(边框半径:borderRadius.circular(8.0)),
),
),
//填充物(
//填充:所有边缘设置(2.0),
// ),
文本字段(
一旦更改:(文本){
passwd=文本;
},
蒙昧文字:对,
装饰:输入装饰(
前缀:图标(图标锁定轮廓),
labelText:“密码”,
边框:大纲输入边框(边框半径:borderRadius.circular(8.0)),
),
),
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
材料按钮(
onPressed:detailsmust,
子项:文本(“登录”),
颜色:颜色。绿色,
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(10.0)),
),
填充物(
填充:所有边缘设置(5.0),
),
材料按钮(
按下:(){},
子项:文本(“退出”),
颜色:颜色。绿色,
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(10.0)),
),
],
),
],
),
);
}
}

欢迎使用编程,您的逻辑是正确的。有很多方法可以检查您想要的值和功能。在Flatter中,您可以使用
TextField
s或
TextFormField
s,它们具有
TextEditingControllers
、和
验证器
以及许多您应该研究的其他功能。这些功能确实可以验证用户输入,并启用或禁用某些功能,例如登录用户作为您的案例。你能想到的都能做到。开始阅读和工作

编辑1: 关于你的应用程序的一般用途,我建议你这样使用它,当使用TextFields时,请确保记住你有方便使用的
TextEditingController
,因此,你应该修改你的submit函数,使其看起来像这样:

TextEditingController usrname = TextEditingController();
TextEditingController passwd = TextEditingController();



void detailsmust() {
      if (usrname.text == "" || passwd.text == "") {
        setState(() {//setState is needed in order for the UI to change.
          Tooltip(message: "Username & Password field cant be empty");
        });
      } else {
        Navigator.pushNamed(context, '/account'); //was missing a semicolon here
      }
    }
//for userName
TextField(
maxLength: 30,
controller:usrname
//rest of your textfields as they were
)

//for password
TextField(
controller:passwd
)
在文本字段中,您不必使用on changed now,只需指向控制器,如下所示:

TextEditingController usrname = TextEditingController();
TextEditingController passwd = TextEditingController();



void detailsmust() {
      if (usrname.text == "" || passwd.text == "") {
        setState(() {//setState is needed in order for the UI to change.
          Tooltip(message: "Username & Password field cant be empty");
        });
      } else {
        Navigator.pushNamed(context, '/account'); //was missing a semicolon here
      }
    }
//for userName
TextField(
maxLength: 30,
controller:usrname
//rest of your textfields as they were
)

//for password
TextField(
controller:passwd
)
您不必再声明变量
String username
String passwd
,文本编辑控制器将侦听字段的输入。
要捕获控制器中保存的值,请使用属性
.text
,如
username.text

中所述,您可以为自己做的最好的事情是继续编码,关于如何提问部分的提问,请始终发布您编写的代码,社区将予以回复。不要指望别人为你写代码,但要把你遇到的困难和确切的问题写出来。编码快乐。谢谢你的肯定回复。如果我能从您的逻辑中获得更多细节,比如我可以使用什么语法或示例代码,那就太好了。我对你说的小部件知之甚少。目前我正在为myapp执行此步骤,我为用户名和密码创建了两个文本字段,并将其值作为字符串存储在变量“usrname”和“passwd”中。我为登录制作了一个Materialbutton,它的onpressed属性是调用一个名为“detailsrequired”的函数。现在我想在这个函数中接受“usrname”和“passwd”,这样我就可以在下一页输入工具提示和导航器。我该怎么做?我编辑了我的帖子并上传了我的代码。我不希望有人为我写代码。我只想看一个这样的例子,这样我就可以对它进行更多的研究。哈哈,无论如何,谢谢你