如何使用Flutter Web在列表视图中动态添加下拉按钮或删除下拉列表? [英] How To Dynamically add Dropdown buttons or delete dropdown(s) in listview with flutter Web?

查看:475
本文介绍了如何使用Flutter Web在列表视图中动态添加下拉按钮或删除下拉列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个页面,该页面上的用户将单击标题以编辑内容,并可以添加和删除该文章所附的设备,

i have created a page where a user who will click a title to edit the contents and can add and delete devices that the article is attached to,

但是我无法弄清楚如何动态编写下拉菜单,当用户按下添加设备按钮时添加更多下拉菜单,

but i could not figure it out on how to program the drop down dynamically, to add more drop downs when a user press the add device button,

他们也希望我添加的其他功能在下拉列表中,当他们选择无"时,也应该删除该下拉列表,

the additional function they want me to add as well is on the Dropdown list, when they select 'NONE' it should remove that dropdown as well,

如果通过UI完成操作,我打算将mysql,xampp或sqlite用于我的数据库,

i am planning to use mysql,xampp or sqlite for my database if im done with the UI,

import 'package:flutter/material.dart';
import 'package:surveyadminpanel/Contents/tabbar.dart';
import 'package:surveyadminpanel/widgets/button.dart';
import 'package:surveyadminpanel/widgets/simplewidgets.dart';
import 'homepage.dart';
import 'dart:ui';

class Item {
  Item(this.name);
  String name;
}

class editsurvey extends StatefulWidget {
  @override
  _editsurveyState createState() => _editsurveyState();
}

class _editsurveyState extends State<editsurvey>{

  int surveyquestionnum = 1;
  int surveyquestiontotal = 1;

  List<Item> selectedUser = [null, null];
  List<Item> selecteddata = [null, null];
  List<Item> users;


  int linkdevices = 1;
  String dropdownvalue= "SELECT FROM DROPDOWN";
  List data = [
    'Sample Data 1',
    'Sample Data 2',
    'Sample Data 3',
    'Sample Data 4',
    'Sample Data 5',
    'Sample Data 6',
  ];




  @override
  void initState() {
    super.initState();
    users = <Item>[
      Item('Sample device 1'),
      Item('Sample device 2'),
      Item('Sample device 3'),
      Item('Sample device 4'),
    ];
  }

  @override
  Widget _dropdownbutton (List<Item> userlist, int index){
    return Container(
      padding: EdgeInsets.all(1),
      width: MediaQuery.of(context).size.width,
      decoration: BoxDecoration(
        border: Border.all(),
        borderRadius: BorderRadius.all(
            Radius.circular(15.0) //
        ),
      ),
      child: DropdownButton<Item>(
        underline: SizedBox(),
        isExpanded: true,
        icon: Icon(Icons.arrow_drop_down),
        hint:  Text("  $dropdownvalue"),
        value: selectedUser[index],
        onChanged: (Item Value) {
          setState(() {
            selectedUser[index] = Value;
          });
        },
        items: userlist.map((Item user) {
          return  DropdownMenuItem<Item>(
            value: user,
            child: Row(
              children: <Widget>[
                SizedBox(width: 10,),
                Text(
                  user.name,
                  style:  TextStyle(color: Colors.black),
                ),
              ],
            ),
          );
        }).toList(),
      ),
    );
  }
  Widget _text(texthere,bold,size,color){
    return Text(texthere,style: TextStyle(fontWeight: bold,fontSize: size,color: color),overflow: TextOverflow.ellipsis,maxLines: 1);
  }
  Widget _logo(){
    return InkWell(
        onTap: (){
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => admincontent()),
          );
        },
        child: Container(width: 500,height: 200,child: Image.asset("images/v2.jpg")));
  }

  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    double screenWidth = MediaQuery.of(context).size.width;
    return Scaffold(
      appBar: AppBar(
        title: Padding(padding: EdgeInsets.only(left: 30),
            child: RichText(
              text: TextSpan(
                  text: 'Good Morning Welcome to Sample:',
                  style: TextStyle(
                      color: Colors.blueAccent, fontSize: 18),
                  children: <TextSpan>[
                    TextSpan(text: usernametitle,
                      style: TextStyle(
                          color: Colors.black, fontSize: 18),
                    )
                  ]
              ),
            )
        ),
        elevation: 1,
        automaticallyImplyLeading: false,
        backgroundColor: Colors.white,
        leading: _logo(),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.notifications),
            color: Colors.blueAccent,
            tooltip: 'Show Notification',
            onPressed: () {
            },
          ),
          IconButton(
            color: Colors.lightGreen,
            icon: const Icon(Icons.account_circle),
            tooltip: 'Check your Profile',
            onPressed: () {
            },
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Container(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              SizedBox(height: 5),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  _text("EDIT SURVEY", FontWeight.bold, 20,Colors.blue),
                  roundedRectButton("BACK", signInGradients),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  Container(
                      width: screenWidth/1.6,
                      height: screenHeight/1.6,
                      decoration: BoxDecoration(
                        color: Colors.orange[200],
                        borderRadius: new BorderRadius.all(new Radius.circular(20.0)),
                      ),
                      child: Padding(
                        padding: const EdgeInsets.all(12.0),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.start,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            _text("SURVEY TITLE", FontWeight.bold, 17,Colors.white),
                            _text(data[0], FontWeight.bold, 19, Colors.black),
                            _text("DATE CREATED", FontWeight.bold, 17,Colors.white),
                            _text(data[1], null, 19, Colors.black),
                            _text("CURRENT STATUS", FontWeight.bold, 17,Colors.white),
                            _text(data[2], null, 19, Colors.black),
                            _text("LANGUAGE VERSION", FontWeight.bold, 17,Colors.white),
                            _text(data[3], null, 19, Colors.black),
                            _text("NUMBERS OF ASSESSORS", FontWeight.bold, 17,Colors.white),
                            _text(data[4], null, 19, Colors.black),
                            _text("TOTAL RENDERED SURVEYS", FontWeight.bold, 17,Colors.white),
                            _text(data[5], null, 19, Colors.black),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: <Widget>[
                                InkWell(
                                  onTap: (){

                                  },
                                  child: Container(width: 100,height: 50,child: Text("EDIT SURVEY")),
                                ),
                                _text("LINKED DEVICES : $linkdevices", FontWeight.bold, 17,Colors.white),
                              ],
                            )
                          ],
                        ),
                      )
                  ),
                  Container(
                    decoration: BoxDecoration(
                        border: Border.all(
                            color: Colors.black,
                            width: 1.0,
                            style: BorderStyle.solid
                        )
                    ),
                    width: screenWidth/1.6,
                    height: screenHeight/1.6,
                    child: Column(
                      children: <Widget>[
                        _text("DEVICES PINNED", FontWeight.bold, 20,Colors.blue),
                        ListView.separated(
                            shrinkWrap: true,
                            itemCount: linkdevices,
                            itemBuilder: (context, index){
                              return Padding(
                                padding: const EdgeInsets.all(8.0),
                                child: _dropdownbutton(users, index),
                              );
                            },
                            separatorBuilder: (context, index) => Container(height: 10),
                            ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            InkWell(
                              child: roundedRectButton("ADD DEVICE", signInGradients),
                              onTap: (){

                              },
                            ),
                            InkWell(
                              child: roundedRectButton("CLEAR ALL DEVICE", signInGradients),
                              onTap: (){

                              },
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

计划

结果

我仍在设法解决这个问题,但是如果有人可以帮我搭便车,我将非常感谢谁能在这里帮助我,

im still trying to figure this out, but if someone can give me a lift,, im gonna be very thankful to who can help me out here ,,

推荐答案

您可以在
下复制粘贴运行完整代码 您可以增加linkdevicesselectedUser

You can copy paste run full code below
You can increase linkdevices and selectedUser

代码段

List<Item> selectedUser = [null];
...
InkWell(
          child: Text("ADD DEVICE"),
          onTap: () {
            selectedUser.add(null);
            linkdevices ++;
            setState(() {

            });

工作演示

完整代码

import 'package:flutter/material.dart';

class Item {
  Item(this.name);
  String name;
}

class editsurvey extends StatefulWidget {
  @override
  _editsurveyState createState() => _editsurveyState();
}

class _editsurveyState extends State<editsurvey> {
  int surveyquestionnum = 1;
  int surveyquestiontotal = 1;

  List<Item> selectedUser = [null];
  List<Item> selecteddata = [null, null];
  List<Item> users;

  int linkdevices = 1;
  String dropdownvalue = "SELECT FROM DROPDOWN";
  List data = [
    'Sample Data 1',
    'Sample Data 2',
    'Sample Data 3',
    'Sample Data 4',
    'Sample Data 5',
    'Sample Data 6',
  ];

  @override
  void initState() {
    super.initState();
    users = <Item>[
      Item('Sample device 1'),
      Item('Sample device 2'),
      Item('Sample device 3'),
      Item('Sample device 4'),
    ];

  }

  @override
  Widget _dropdownbutton(List<Item> userlist, int index) {
    return Container(
      padding: EdgeInsets.all(1),
      width: MediaQuery.of(context).size.width,
      decoration: BoxDecoration(
        border: Border.all(),
        borderRadius: BorderRadius.all(Radius.circular(15.0) //
            ),
      ),
      child: DropdownButton<Item>(
        underline: SizedBox(),
        isExpanded: true,
        icon: Icon(Icons.arrow_drop_down),
        hint: Text("  $dropdownvalue"),
        value: selectedUser[index],
        onChanged: (Item Value) {
          print(Value.toString());
          print(index);
          setState(() {
            selectedUser[index] = Value;
          });
        },
        items: userlist.map((Item user) {
          return DropdownMenuItem<Item>(
            value: user,
            child: Row(
              children: <Widget>[
                SizedBox(
                  width: 10,
                ),
                Text(
                  user.name,
                  style: TextStyle(color: Colors.black),
                ),
              ],
            ),
          );
        }).toList(),
      ),
    );
  }

  Widget _text(texthere, bold, size, color) {
    return Text(texthere,
        style: TextStyle(fontWeight: bold, fontSize: size, color: color),
        overflow: TextOverflow.ellipsis,
        maxLines: 1);
  }

  Widget _logo() {
    return InkWell(
        onTap: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => admincontent()),
          );
        },
        child: Container(
            width: 500, height: 200, child: Image.asset("images/v2.jpg")));
  }

  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    double screenWidth = MediaQuery.of(context).size.width;
    return Scaffold(
      appBar: AppBar(
        title: Padding(
            padding: EdgeInsets.only(left: 30),
            child: RichText(
              text: TextSpan(
                  text: 'Good Morning Welcome to Sample:',
                  style: TextStyle(color: Colors.blueAccent, fontSize: 18),
                  children: <TextSpan>[
                    TextSpan(
                      text: "usernametitle",
                      style: TextStyle(color: Colors.black, fontSize: 18),
                    )
                  ]),
            )),
        elevation: 1,
        automaticallyImplyLeading: false,
        backgroundColor: Colors.white,
        leading: _logo(),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.notifications),
            color: Colors.blueAccent,
            tooltip: 'Show Notification',
            onPressed: () {},
          ),
          IconButton(
            color: Colors.lightGreen,
            icon: const Icon(Icons.account_circle),
            tooltip: 'Check your Profile',
            onPressed: () {},
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Container(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              SizedBox(height: 5),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  _text("EDIT SURVEY", FontWeight.bold, 20.0, Colors.blue),
                  //roundedRectButton("BACK", signInGradients),
                  Text("BACK"),
                ],
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  Container(
                      width: screenWidth / 1.6,
                      height: screenHeight / 1.6,
                      decoration: BoxDecoration(
                        color: Colors.orange[200],
                        borderRadius:
                            new BorderRadius.all(new Radius.circular(20.0)),
                      ),
                      child: Padding(
                        padding: const EdgeInsets.all(12.0),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.start,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            _text("SURVEY TITLE", FontWeight.bold, 17.0,
                                Colors.white),
                            _text(data[0], FontWeight.bold, 19.0, Colors.black),
                            _text("DATE CREATED", FontWeight.bold, 17.0,
                                Colors.white),
                            _text(data[1], null, 19.0, Colors.black),
                            _text("CURRENT STATUS", FontWeight.bold, 17.0,
                                Colors.white),
                            _text(data[2], null, 19.0, Colors.black),
                            _text("LANGUAGE VERSION", FontWeight.bold, 17.0,
                                Colors.white),
                            _text(data[3], null, 19.0, Colors.black),
                            _text("NUMBERS OF ASSESSORS", FontWeight.bold, 17.0,
                                Colors.white),
                            _text(data[4], null, 19.0, Colors.black),
                            _text("TOTAL RENDERED SURVEYS", FontWeight.bold,
                                17.0, Colors.white),
                            _text(data[5], null, 19.0, Colors.black),
                            Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: <Widget>[
                                InkWell(
                                  onTap: () {},
                                  child: Container(
                                      width: 100,
                                      height: 50,
                                      child: Text("EDIT SURVEY")),
                                ),
                                _text("LINKED DEVICES : $linkdevices",
                                    FontWeight.bold, 17.0, Colors.white),
                              ],
                            )
                          ],
                        ),
                      )),
                  Container(
                    decoration: BoxDecoration(
                        border: Border.all(
                            color: Colors.black,
                            width: 1.0,
                            style: BorderStyle.solid)),
                    width: screenWidth / 1.6,
                    height: screenHeight / 1.6,
                    child: Column(
                      children: <Widget>[
                        _text("DEVICES PINNED", FontWeight.bold, 20.0,
                            Colors.blue),
                        ListView.separated(
                          shrinkWrap: true,
                          itemCount: linkdevices,
                          itemBuilder: (context, index) {
                            return Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: _dropdownbutton(users, index),
                            );
                          },
                          separatorBuilder: (context, index) => Container(height: 10),
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            InkWell(
                              child: Text("ADD DEVICE"),
                              onTap: () {
                                selectedUser.add(null);
                                linkdevices ++;
                                setState(() {

                                });
                                /*listWidget.add(  ListView.separated(
                                  shrinkWrap: true,
                                  itemCount: linkdevices,
                                  itemBuilder: (context, index) {
                                    return Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: _dropdownbutton(users, index),
                                    );
                                  },
                                  separatorBuilder: (context, index) => Container(height: 10),
                                ));
                                setState(() {

                                });*/
                              },
                            ),
                            InkWell(
                              child: Text("CLEAR ALL DEVICE"),
                              onTap: () {},
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

class admincontent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: editsurvey(),
    );
  }
}

这篇关于如何使用Flutter Web在列表视图中动态添加下拉按钮或删除下拉列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆