问题描述
我正在一个项目中,我必须创建一个包含意外项目的餐食。例如,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;
}
}
打印列表:
[Beef Burger,Chicken Burger,Masala Fries,Spirit]
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)