微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能在同一屏幕上同时显示Snackbar和登录表单

如何解决不能在同一屏幕上同时显示Snackbar和登录表单

我在Flutter中开发了一个用户登录功能,并且可以正常工作。但是,当登录无效时,我无法在同一屏幕上显示SnackBar和登录表单。 SnackBar出现在另一个没有登录表单的屏幕中。我认为这对于车工来说正在发生。但是,如果我删除了车工,则颤振会产生错误。那么如何在同一屏幕上显示它们呢?请帮忙。提前致谢。这是我的代码

     Future<Login> userLogin(String email,String password) async {
       Map<String,dynamic> map = {'email': email,'password': password};

     final http.Response response = await http.post(
     'my PHP page',headers: <String,String>{
       'Content-Type': 'application/json; charset=UTF-8',},body: jsonEncode(map),);

     if (response.statusCode == 201 || response.statusCode == 200) {
       return Login.fromJson(json.decode(response.body));
     } else {
       throw Exception('Failed to login.');
     }
     }

     class Login {
       final String usrid;
       final String status;

       Login({this.usrid,this.status});

       factory Login.fromJson(Map<String,dynamic> json) {
        return Login(usrid: json['usrid'],status: json['type']);
       }
      }

      void main() {
       runApp(MaterialApp(
         home: MyApp(),));
     }

     class MyApp extends StatefulWidget {
       MyApp({Key key}) : super(key: key);
       @override
       State<StatefulWidget> createState() {
         return _TextControl();
       }
     }

     class _TextControl extends State<MyApp> {
       //String status = '';
       final _formKey = GlobalKey<FormState>();
       final TextEditingController _controller = TextEditingController();
       final TextEditingController _controller2 = TextEditingController();
  
     @override
      void dispose() {
       _controller.dispose();
       _controller2.dispose();
       super.dispose();
     }

     Future<Login> _futureLogin;
     @override
     Widget build(BuildContext context) {
       return Scaffold(
         appBar: AppBar(
            centerTitle: true,backgroundColor: Colors.purple[400],title: Text('Login'),),body: Container(
              padding: EdgeInsets.only(left: 15,top: 20,right: 15,bottom: 20),child: Column(
              children: <Widget>[
                Center(
                  child: Image(image: Assetimage('assets/images/logo.png')),Container(
                  padding:
                      EdgeInsets.only(left: 0,top: 30,right: 0,bottom: 0),child: Form(
                    key: _formKey,child: (_futureLogin == null)
                        ? Column(
                            crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[
                              TextFormField(
                                controller: _controller,decoration: Inputdecoration(hintText: 'Email'),keyboardType: TextInputType.emailAddress,validator: (value) {
                                  if (value.isEmpty || !value.isValidEmail()) {
                                    return 'Please enter valid email.';
                                  }
                                  return null;
                                },TextFormField(
                                controller: _controller2,decoration:
                                    Inputdecoration(hintText: 'Password'),obscureText: true,validator: (value) {
                                  if (value.isEmpty) {
                                    return 'Please enter password.';
                                  }
                                  return null;
                                },Container(
                                margin: EdgeInsets.all(10.0),child: RaisedButton(
                                  color: Colors.purple[400],padding: EdgeInsets.only(
                                      left: 100,top: 10,right: 100,bottom: 10),textColor: Colors.white,onpressed: () {
                                    if (_formKey.currentState.validate()) {
                                      setState(() {
                                        _futureLogin = userLogin(
                                            _controller.text,_controller2.text);
                                      });
                                    }
                                  },child: Text('Login',style: TextStyle(fontSize: 18.0)),],)
                        : FutureBuilder<Login>(
                            future: _futureLogin,builder: (context,snapshot) {
                              if (snapshot.hasData) {
                                //return Text(snapshot.data.usrname);
                                if (snapshot.data.status == '1') {
                                  Navigator.push(
                                    context,MaterialPageRoute(
                                        builder: (context) => Textinput()),);
                                } else if (snapshot.data.status == '2') {
                                  
                                     Scaffold.of(context).showSnackBar(
                                        SnackBar(content: Text('Invalid login credentials.')));
                                  return Text('');
                                }
                              } else if (snapshot.hasError) {
                                return Text("${snapshot.error}");
                              }
                              return Center(child: CircularProgressIndicator());
                            },)));
            }
           }

解决方法

您可以将Snackbar用于此错误记录目的。小吃店还可以提供颜色,持续时间,压印功能以及更多其他功能。

vertical-align

class SeparateWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
        child: Text("Button moved to separate widget"),onPressed: () {
          Scaffold.of(context).showSnackBar(SnackBar(
                content: Text('Button moved to separate widget'),duration: Duration(seconds: 3),));
        });
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。