使用SingleChildScrollView时无法向下拖动底部表单

问题描述 投票:0回答:1

我创建了一个带有底部表格和列表视图生成器的应用程序。在底部,有一个文本按钮,当我将其向上拖动时,底部表格必须出现。底页上有一张表格。我用 SingleChildScrollView 包裹底部纸张。但是当我单击 TextFormField 键盘时,我可以滚动底部工作表。但我无法将其向下拖动并关闭底部工作表。即使我按手机上的后退箭头来摆脱键盘。

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  const Home({Key key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  @override
  Widget build(BuildContext context) {
    var width = MediaQuery.of(context).size.width;
    return Scaffold(

        resizeToAvoidBottomInset: false,
        body: Stack(
                children: [
                  ListView.builder(
                      itemCount: 1,
                      itemBuilder: (context, index) {
                        return Card(
                          );
                      }),
                  Positioned(
                    bottom: 0,
                    child: GestureDetector(
                      onPanEnd: (details) {
                        if (details.velocity.pixelsPerSecond.dy < 10) {

                          //Bottom Sheet.................................................................................................................

                          showModalBottomSheet(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.vertical(
                                    top: Radius.circular(25)),
                              ),
                              backgroundColor: Colors.green,
                              context: context,
                              builder: (context) {
                                return SingleChildScrollView(
                                  child: Container(
                                    padding: EdgeInsets.all(10),
                                    child: Form(
                                        child: Column(
                                          children: [
                                            Icon(Icons.arrow_drop_down),
                                            Text("Drag down to Close"),

                                            Container(
                                              color: Colors.red,
                                              child: Column(
                                                children: [
                                                  Row(
                                                    children: [
                                                      Expanded(
                                                        child: TextFormField(
                                                          decoration: InputDecoration(
                                                            labelText: "Current amount",
                                                          ),
                                                        ),
                                                      ),
                                                    ],
                                                  ),
                                                  Row(
                                                    children: [
                                                      Expanded(
                                                          child: TextButton(
                                                              onPressed: () {},
                                                              child: Text("Submit"))),
                                                    ],
                                                  ),
                                                ],
                                              ),
                                            ),
                                          ],
                                    )),
                                  ),
                                );
                              });
                          // Bottom Sheet Ends ......................................................................................................................................................
                        }
                      },
                      child: Container(
                        color: Colors.blue,
                        width: width,
                        padding: EdgeInsets.all(10),
                        child: Column(
                          children: [
                            Icon(Icons.arrow_drop_up),
                            Text("Drag up to Enter an Account"),
                          ],
                        ),
                      ),
                    ),
                  )
                ]),
        );
  }
}
forms flutter bottom-sheet singlechildscrollview
1个回答
4
投票

这可以分两步完成:

  1. SingleChildScrollView
    放入
    showModalBottomSheet
    的构建器函数中。

  2. 确保使用这些属性:

showModalBottomSheet(
    enableDrag: true,
    isScrollControlled: true,
    // ...
);

此外,将

showModalBottomSheet
函数调用提取到单独的方法中可以使代码更具可读性,从而使两条注释变得多余。

这是一个完整的示例:

Widget openModalBottomSheet() {

    Size size = MediaQuery.of(context).size;
    showModalBottomSheet(

        enableDrag: false,
        isDismissible: false,
        isScrollControlled: true,

        context: context,
        builder:(context)
        {
          return GestureDetector(
            behavior: HitTestBehavior.opaque,

            child: SingleChildScrollView(
              child: Container(
                padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom+10),
                // height: size.height*0.6,
                decoration: BoxDecoration(
                  color: Colors.white,

                ),
                child: Column(
                  children: [
                    Padding(
                      padding: const EdgeInsets.all(25.0),
                      child: Container(
                        decoration: BoxDecoration(
                          //color: Colors.red,
                          borderRadius: BorderRadius.circular(20),
                        ),

                        height: size.height*0.5,
                        width: double.infinity,
                        child: Card(
                          elevation: 4,
                          child: Padding(
                            padding: const EdgeInsets.all(12.0),
                            child: Form(
                              key: _formKey,
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.start,
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: [


                                  NameField(

                                    name:sectionname,
                                    controller: null,
                                    icon: Icons.person,
                                    hintText: "Please enter section name",
                                    text: "you not enter Smaster",

                                    onchanged: (value)
                                    {
                                      setState(() {
                                        Administrative.instance.SectionName=value;
                                      });

                                    },


                                  ),
                                  NameField(

                                    controller:null,
                                    name:smaster,
                                    icon: Icons.vpn_key_outlined,
                                    hintText: "Please enter Section Smaster",
                                    text: "your enter empty Smaster",
                                    onchanged: (value)
                                    {
                                      setState(() {
                                        Administrative.instance.Smaster=value;
                                      });

                                    },


                                  ),
                                ],
                              ),
                            ),
                          ),

                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(left: 20.0,right: 20.0,top: 8.0,bottom: 8.0),
                      child: Container(
                        width: double.infinity,
                        height: 60,
                        child: FlatButton(
                          color: Colors.black,
                          onPressed: (){
                            if(!_formKey.currentState.validate()){
                              return;
                            }
                            else
                            {
                              _formKey.currentState.save();
                              // signupauth.instance.addstudent();
                              if(Administrative.instance.SectionName==null)
                              {
                                Administrative.instance.SectionName=sectionname;
                              }

                              else if(Administrative.instance.Smaster==null)
                              {
                                Administrative.instance.Smaster=smaster;
                              }
                              print("hello"+ids);
                              FirebaseFirestore.instance
                                  .collection("Section")
                                  .doc(ids).update({
                                "SectionName":Administrative.instance.SectionName,
                                "Smaster":Administrative.instance.Smaster,
                              });
                              Fluttertoast.showToast(
                                  msg: "Section is added",
                                  toastLength: Toast.LENGTH_LONG,
                                  gravity: ToastGravity.CENTER,
                                  timeInSecForIosWeb: 1,
                                  backgroundColor: Colors.grey,
                                  textColor: Colors.white,
                                  fontSize: 16.0

                              );
                              Navigator.pop(context);
                            }


                          },
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(10.0),

                          ),
                          child: Text("Save",style: TextStyle(color: Colors.white,fontSize: 18,fontWeight: FontWeight.bold),),
                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.only(left: 20.0,right: 20.0,top: 8.0,bottom: 8.0),
                      child: Container(
                        width: double.infinity,
                        height: 60,
                        child: FlatButton(
                          color: Colors.black,
                          onPressed: (){
                            Navigator.pop(context);
                          },
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(10.0),

                          ),
                          child: Text("Cancel",style: TextStyle(color: Colors.white,fontSize: 18,fontWeight: FontWeight.bold),),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          );
        }
    );
  }
© www.soinside.com 2019 - 2024. All rights reserved.