如何在Flutter中调整动态生成的RadioButtonGroup的值?

问题描述

我正在一个项目中,我必须创建一个包含意外项目的餐食。例如,Deal有2个比萨饼,2个饮料和1个面包卷。但是,在另一笔交易中,商品可能会有所不同,例如3个披萨,2个饮料和2个面包卷。为此,我根据每个项目数量为每个生成一个单选按钮组。所以问题是当我在某些情况下设置radiobuttongroup的值时,它不会显示,因为当第一个循环以索引值0运行并且内部循环以索引值0、1运行2次时。放置值将是0 + 0 = 0,第二次是0 + 1 =1。但是当上一次循环以索引值1运行第二次并且内部循环再次从0开始时,将它们相加后的值将是1 + 0再次= 1,因为它会覆盖已经放置在列表1索引中的先前值,因此,radiobuttongroup的值混乱了。如何有效设置每个单选按钮组的值?

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:food_app/database/dbhelper.dart';
import 'package:grouped_buttons/grouped_buttons.dart';

class DealScreen extends StatefulWidget {
  @override
  _DealScreenState createState() => _DealScreenState();
}
final dbHelper = DBHelper.instance;
int totalQty = 0;
List<String> _picked = List(totalQty);

class _DealScreenState extends State<DealScreen> {

  Deal2 d;
  List<Deal2> myLst = [];

  Future getList() async{
    String deal = 'Azadi Deal';
    d = Deal2(proName: deal);
    try{
      myLst = await d.dealItems();
      setState(() {
        myLst = new List.from(myLst.reversed);
      });
    }
    catch(e)
    {
      print(e);
    }

    for(int i=0; i < myLst.length; i++)
    {
      print('${i+1} : ${myLst[i].proName}');
      if(myLst[i].children.length > 0)
      {
        for(var pro in myLst[i].children)
        {
          print('    ${pro.proName}');
        }
      }
    }
  }

  @override
  void initState() {
    super.initState();
    getList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.red,elevation: 0.0,title: Text('Deals'),centerTitle: true,),body: ListView.builder(
          shrinkWrap: true,scrollDirection: Axis.vertical,itemBuilder: (context,index) => EntryItem(myLst[index],index),itemCount: myLst.length,);
  }
}

class EntryItem extends StatelessWidget {

  final Deal2 deal2;
  final int mainIndex;
  const EntryItem(this.deal2,this.mainIndex);

  @override
  Widget build(BuildContext context) {
    return _buildTiles(deal2);
  }

  Widget _buildTiles(Deal2 deal2) {
    return ExpansionTile(
        key: PageStorageKey<Deal2>(deal2),initiallyExpanded: true,title: Text(deal2.proName,style: TextStyle(fontWeight: FontWeight.bold,color: Colors.red),children: <Widget>[
          ListView.builder(
              scrollDirection: Axis.vertical,physics: ClampingScrollPhysics(),itemCount: deal2.qty,shrinkWrap: true,key: PageStorageKey<Deal2>(deal2),index){
                return ItemSubList(deal2,mainIndex+index);
              }),],);
  }
}

class ItemSubList extends StatefulWidget {

  final Deal2 deal2;
  final int _index;
  const ItemSubList(this.deal2,this._index);

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

class _ItemSubListState extends State<ItemSubList> {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: Column(
          children: <Widget>[
            Align(
              alignment: Alignment.topLeft,child: Padding(
                padding: const EdgeInsets.only(left: 20.0),child: Text(widget.deal2.any,textAlign: TextAlign.left,style: TextStyle(
                    fontSize: 10.0,fontWeight: FontWeight.bold,RadioButtonGroup(
              key: PageStorageKey(Deal2),picked: _picked[widget._index],activeColor: Colors.red,labels: widget.deal2.children.map((e) => e.proName).toList(),onSelected: (val){
                setState(() {
                  if(_picked[widget._index] != null)
                    {
                      _picked[widget._index+1] = val;
                    }
                  else {
                    _picked[widget._index] = val;
                  }
                  print(val);
                  print(_picked);
                });
              },);
  }
}

class Deal2{
  String proName,any;
  int qty;
  List<Deal2> children;
  List<Deal2> productLst = [];

  Deal2({ this.proName,this.any,this.qty,this.children = const <Deal2>[] });


  Future<List<Deal2>> dealItems() async{
    var product = await dbHelper.getSpecific(this.proName);
    for(int i = 0; i < product.length; i++)
      {
        var productItem = await dbHelper.getItems(product[i]['category']);
        totalQty += product[i]['qty'];
        List<Deal2> itmLst = List();

        productItem.forEach((e) {
          if(e.containsKey('item'))
            {
              itmLst.add(Deal2(proName: e['item']));
            }
          else{
            productLst.add(Deal2(proName: product[i]['category'],any: product[i]['any'],qty: product[i]['qty']));
          }
        });
        productLst.add(Deal2(proName: product[i]['category'],qty: product[i]['qty'],children: itmLst));
    }
    return Future.value(productLst);
  }
}

数据库类:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DBHelper {
  //Database name and version
  static final _dbName = "food.db";
  static final _dbVersion = 1;

  //Table name
  static final table = "DealOnSpot";

  //Columns name
  static final dealID = "id";
  static final dealName = "deal";
  static final dealPrice = "price";
  static final category = "category";
  static final itemName = "item";
  static final quantity = "qty";
  static final chooseAny = "any";

  //Database variable
  static Database _db;

  DBHelper._pvtConst();

  static final DBHelper instance = DBHelper._pvtConst();

  Future<Database> get database async {
    if (_db != null) return _db;
    _db = await _initDB();
    return _db;
  }

  _initDB() async {
    Directory documentDir = await getApplicationDocumentsDirectory();
    String path = join(documentDir.path,_dbName);
    return await openDatabase(path,version: _dbVersion,onCreate: _onCreate);
  }

  Future _onCreate(Database db,int version) async {
    await db.execute(
        '''
      CREATE TABLE $table(
        $dealID INTEGER PRIMARY KEY,$dealName TEXT NOT NULL,$dealPrice INTEGER NOT NULL,$category TEXT NOT NULL,$itemName TEXT NOT NULL,$quantity INTEGER NOT NULL,$chooseAny TEXT NOT NULL
      )
      '''
    );
  }

  Future<int> insertRow(Map<String,dynamic> row) async {
    Database db = await instance.database;
    return await db.insert(table,row);
  }

  Future<List<Map<String,dynamic>>> getAll() async {
    Database db = await instance.database;
    return await db.query(table);
  }

  Future<List<Map<String,dynamic>>> getSpecific(String deal) async {
    Database db = await instance.database;
    var res = await db.rawQuery('SELECT DISTINCT category,qty,any FROM $table WHERE deal = ?',[deal]);
    return res;
  }

  Future<List<Map<String,dynamic>>> getItems(String cat) async {
    Database db = await instance.database;
    var res = await db.rawQuery('SELECT DISTINCT item FROM $table WHERE category = ?',[cat]);
    return res;
  }

  Future<List<Map<String,dynamic>>> getSpecificAll(String deal) async {
    Database db = await instance.database;
    var res = await db.rawQuery('SELECT * FROM $table WHERE deal = ? ',dynamic>>> getItemList(String deal,String item) async {
    Database db = await instance.database;
    var res = await db.rawQuery('SELECT DISTINCT item any FROM $table WHERE deal = ? AND category = ?',[deal,item]);
    return res;
  }
}

屏幕截图:

Screenshot 1

Screenshot 2

打印列表: [Beef Burger,Chicken Burger,Masala Fries,Spirit]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)