Как добавить функцию Onpressed к каждому значению списка

#flutter

#flutter

Вопрос:

У меня были трудности с переходом элемента в списке в новый файл .dart, вот моя главная страница, я импортировал второй файл

 class Home extends StatefulWidget {
  @override
  _HomeState createState() => new _HomeState();
}

class _HomeState extends State<Home> {

  final List<String>listof=["Decimal Numbers","Binary Numbers","Decimal-to-Binary Conversion","Binary Arithmetic","Complements of Binary Numbers","Signed Numbers","Arithmetic Operations with Signed Numbers","Hexadecimal Numbers","Octal Numbers","Binary Coded Decimal (BCD)"];



    @override
      Widget build(BuildContext context) {
        return new Scaffold(
           appBar: new AppBar(
             title: new Text(
               "Computer System Theory",
               style:  new TextStyle(fontSize: 19.0),
             ), 
             backgroundColor: Colors.deepPurple,

          actions: <Widget>[
            new IconButton(
              icon: new Icon(Icons.search),
              onPressed: ()=>debugPrint("Search"),
             ),
          ],

       ),
       body: new Container(
        child: new ListView.builder(

         itemBuilder: (_, int index)=>listDataItem(this.listof[index],),
         itemCount: this.listof.length,


       ),
       ),       
    );
  }
}

    class listDataItem extends StatelessWidget{

      String itemName;
      listDataItem(this.itemName);

      @override
      Widget build(BuildContext context){
        return new Card(

          elevation: 7.0,

          child: new Container(

            margin: EdgeInsets.all(5.0),
            padding: EdgeInsets.all(6.0),

            child: new Row(
              children: <Widget> [

                new CircleAvatar(
                  child: new Text(itemName[0]),

                  backgroundColor: Colors.deepPurple,
                  foregroundColor: Colors.white,

                ),
                new Padding(padding: EdgeInsets.all(8.0)),
                new Text(itemName,style: TextStyle(fontSize: 18.0)),

              ],
            ),
        ),); 
      }

    }
  

я пробовал этот метод, но я не знаю, как добавить функцию onpress к элементу в списке, если я нажму на любое значение в списке, я должен перейти на страницу с уважением, например, binary.dart

вот мой двоичный код

 import 'package:flutter/material.dart';

class Binary extends StatefulWidget {
  @override
  _BinaryState createState() => _BinaryState();
}

class _BinaryState extends State<Binary> {
  @override
  Widget build(BuildContext context) {
    double cWidth = MediaQuery.of(context).size.width*0.8;
    return new Container (
      padding: const EdgeInsets.all(16.0),
      width: cWidth,
      child: new Column (
        children: <Widget>[
          new Text ("Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 Long text 1 ", textAlign: TextAlign.left),
          new Text ("Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2, Long Text 2", textAlign: TextAlign.left),
        ],
      ),
    );
  }
}
  

Комментарии:

1. Используйте InkWell или GestureDetector

Ответ №1:

Вы можете обернуть элементы списка с помощью InkWell или GestureDetector .

Пример: В методе вашего listDataItem класса build вы возвращаете Card

Оберните его чернильницей.

 InkWell(
  onTap: () {
    print('inkwell');
  },
  child: Card(...
  

Ответ №2:

Я проиллюстрировал код здесь, надеюсь, это поможет

 class listDataItem extends StatelessWidget{

      final String itemName;
      listDataItem(this.itemName);

      @override
      Widget build(BuildContext context){
        return InkWell(
        onTap: () {
        },
        child : Card(

          elevation: 7.0,

          child: new Container(

            margin: EdgeInsets.all(5.0),
            padding: EdgeInsets.all(6.0),

            child: new Row(
              children: <Widget> [

                new CircleAvatar(
                  child: new Text(itemName[0]),

                  backgroundColor: Colors.deepPurple,
                  foregroundColor: Colors.white,

                ),
                new Padding(padding: EdgeInsets.all(8.0)),
                new Text(itemName,style: TextStyle(fontSize: 18.0)),

              ],
            ),
        ),),
        ); 
    }

}