Как вы отображаете страницу сведений при нажатии на соответствующий элемент просмотра списка - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь передать идентификатор элемента списка на другую страницу, чтобы он мог заполнить список элементами, на которые ссылается этот идентификатор:

return SideHeaderListView(
                        itemCount: order.length,
                        itemExtend: 230.0,
                        headerBuilder: (BuildContext context, index) {
                          return new SizedBox(
                            child: Text(order[index]['Month'],
                              style: TextStyle(
                                  color: Colors.green,
                                  fontWeight: FontWeight.bold,
                                  fontSize: 30.0),),);
                        },
                        hasSameHeader: (int a, int b) {
                            return order[a]['Month'] ==
                                order[b]['Month'];

                        },
                        itemBuilder: (BuildContext context, index) {
                          String value;
                          return new GestureDetector(
                              //onLongPress: _showPopupMenu(),
                              onTap: () {
                                Navigator.push(context, MaterialPageRoute(
                                    builder: (context) =>
                                        MyItemList(orders: order[index],)
                                ));
                              },

Это код, который передает идентификатор и вставляет идентификатор в таблице:

    class MyItemList extends StatelessWidget{

  final Map<String, dynamic> orders;
 // final Items items;
  MyItemList({this.orders});
}

FlatButton(
              color: Colors.lightGreen,
              child: Text('ADD',style: TextStyle(color: Colors.white),),
              onPressed: () async {
                OrderProvider.insertItem({
                  'ref':MyItemList().orders,
                  'Quantity': _quantityController.text,
                  'Unit': getDropDownItem().toString(),
                  'TypeOfProduct': _typeController.text,
                  'UnitPrice':_unitpriceController.text,
                  'TotalPrice':getTotalPrice()
                });

Это мой метод класса провайдера:

return await db.rawQuery(
      "select * from Items where ref = ${MyItemList(orders: id,)}",);
  }

1 Ответ

0 голосов
/ 27 мая 2020

Сначала я могу предложить вам использовать виджет StateFul вместо виджета StateLess в вашем MyItemList Class, затем в InitState вы можете получить данные на основе соответствующего Id, например:

class MyItemList extends StatefulWidget {
  // final Map<String, dynamic> orders; 
  // instead of receive a Map receive only the OrderID
  final int orderId;

  MyItemList({this.orderId});

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

class _MyItemListState extends State<MyItemList> {
  List<dynamic> itemsToSave;

  @override
  void initState() {
    super.initState();
    getItems(widget.orderId);
  }
  @override
  Widget build(BuildContext context) {
    return Container();
  }

  getItems(int orderId) async {
    itemsToSave = await yourProvider.getItems(orderId);
    print(itemsToSave);
  }
}

А в вашем провайдере лучше использовать whereArgs например:

await db.rawQuery(
    'SELECT * FROM Items WHERE ref = ?',
    [order],
  ),

А если у вас есть карта заказов, лучше перебрать карту и получить данные по каждому элементу отдельно или проверьте документацию IN Operator для SQLite для получения дополнительных объяснений вы можете проверить это сообщение .

Надеюсь, это поможет.

...