简体   繁体   English

Flutter 在我的动画列表中更改图标 onTap

[英]Flutter changing Icon onTap in my animated List

I'm trying to change my icon after I tap on my List Item.在我点击我的列表项后,我正在尝试更改我的图标。 I already tried different things: I tried the onTap method but the icon just does not want to change.我已经尝试了不同的方法:我尝试了 onTap 方法,但图标就是不想改变。 I'm very new to flutter and I would love to find some help for my problem:).我对 flutter 很陌生,我很想为我的问题找到一些帮助:)。 Here is my code.这是我的代码。

I already searched for solutions but I didn't got it working in my project我已经搜索了解决方案,但我没有在我的项目中使用它

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'To-Do List',
      theme: ThemeData(
        primaryColor: Colors.white,
        brightness: Brightness.dark,
      ),
      home: Scaffold(
        appBar: AppBar(title: Text('To-Do List'),
          backgroundColor: Colors.amber,
        ),
        body: BodyLayout(),
      ),
    );
  }
}

class BodyLayout extends StatefulWidget {
  @override
  BodyLayoutState createState() {
    return new BodyLayoutState();
  }
}

class BodyLayoutState extends State<BodyLayout> {

  // The GlobalKey keeps track of the visible state of the list items
  // while they are being animated.
  final GlobalKey<AnimatedListState> _listKey = GlobalKey();

  // backing data
  List<String> _data = [];
  final _isdone = Set<String>();
 // bool selected = false;
  List<bool> selected = new List<bool>();
  Icon notdone = Icon(Icons.check_box_outline_blank);
  Icon done = Icon(Icons.check_box);

  TextEditingController todoController = TextEditingController();



  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        SizedBox(
          height: 445,
          child: AnimatedList(
            // Give the Animated list the global key
            key: _listKey,
            initialItemCount: _data.length,
            // Similar to ListView itemBuilder, but AnimatedList has
            // an additional animation parameter.
            itemBuilder: (context, index, animation) {
              // Breaking the row widget out as a method so that we can
              // share it with the _removeSingleItem() method.
              return _buildItem(_data[index], animation);
            },
          ),
        ),
        TextField(
          controller: todoController,
          decoration: InputDecoration(
            border: OutlineInputBorder(),
            labelText: 'To-Do'
          ),
        ),

        RaisedButton(
          child: Text('Insert item', style: TextStyle(fontSize: 20)),
          onPressed: () {
            _insertSingleItem();
          },
        ),
        RaisedButton(
          child: Text('Remove item', style: TextStyle(fontSize: 20)),
          onPressed: () {
            _removeSingleItem();
          },
        )
      ],
    );
  }

  // This is the animated row with the Card.
  Widget _buildItem(String item, Animation animation) {
    final isdone = _isdone.contains(item);
    selected.add(false);
    return SizeTransition(
      sizeFactor: animation,
      child: Card(
        child: ListTile(
          title: Text(
            item,
            style: TextStyle(fontSize: 20),
          ),
          trailing: Icon(
           isdone ? Icons.check_box: Icons.check_box_outline_blank
          ),
          onTap: (){
            setState(() {
             
            });
          },

        ),
      ),
    );
  }


  void _insertSingleItem() {
    int insertIndex = 0;
    setState(() {
      _data.insert(0, todoController.text);
    });
    // Add the item to the data list.
    // Add the item visually to the AnimatedList.
    _listKey.currentState.insertItem(insertIndex);
  }

  void _removeSingleItem() {
    int removeIndex = 0;
    // Remove item from data list but keep copy to give to the animation.
    String removedItem = _data.removeAt(removeIndex);
    // This builder is just for showing the row while it is still
    // animating away. The item is already gone from the data list.
    AnimatedListRemovedItemBuilder builder = (context, animation) {
      return _buildItem(removedItem, animation);
    };
    // Remove the item visually from the AnimatedList.
    _listKey.currentState.removeItem(removeIndex, builder);
  }
}```

You have already mentioned the icons above.您已经提到了上面的图标。 You simply need to use them instead of declaring new ones again.您只需要使用它们而不是再次声明新的。

// This is the animated row with the Card.
Widget _buildItem(String item, Animation animation) {
  final isdone = _isdone.contains(item);
  selected.add(false);
  return SizeTransition(
    sizeFactor: animation,
    child: Card(
      child: ListTile(
        title: Text(
          item,
          style: TextStyle(fontSize: 20),
        ),
        trailing: isdone ? done: notdone, // use the icon variables you have already defined
        onTap: (){
          setState(() {
            // add the item to _isdone set if it is not added and remove it if it is added when tapped on the list item
            if(isdone) {
              _isdone.remove(item);
            } else {
              _isdone.add(item);
            }
          });
        },
      ),
    ),
  );
}

In this code, I have added the item and removed the item in setSate() in the onTap() , so that whenever you tap the list item, _isdone Set gets updated and the build() is reloaded.在这段代码中,我在onTap()setSate()中添加了该项并删除了该项,因此,每当您点击列表项时, _isdone Set都会更新并重新加载build() Which makes your layout and data update itself every time you tap on the list item.每次点击列表项时,您的布局和数据都会自行更新。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM