如何使用 onPressed 为选择的收藏图标选择单个颤振 ListTiles?

Posted

技术标签:

【中文标题】如何使用 onPressed 为选择的收藏图标选择单个颤振 ListTiles?【英文标题】:How do I select individual flutter ListTiles for a select favorite icon with onPressed? 【发布时间】:2020-05-28 08:33:17 【问题描述】:

这是我无法添加用户收藏列表的整个代码。我只是想让心形图标在被选为收藏时改变颜色,然后将保存的收藏项推送到保存的收藏页面。

我不知道还能做什么,因为我必须使用 itemLength。使用流构建器似乎不可能。

class Books extends StatefulWidget 
@override
_BooksState createState() => _BooksState();


class _BooksState extends State<Books> 
var firestoreDb = Firestore.instance.collection("books").snapshots();


static final int _itemLength = snapshot.data.documents[index]['title'].length;
List<bool> _isFavorited = List<bool>.generate(_itemLength, (_) => false);


@override
Widget build(BuildContext context) 
return Scaffold(
  appBar: AppBar(
    title: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: <Widget>[
          Container(
              padding: const EdgeInsets.all(8.0),
              child: Text(
                'Book List',
                style: GoogleFonts.lato(
                  fontSize: 22.0,
                  color: Colors.amberAccent.shade50,
                ),
              )),
          IconButton(
            icon: Icon(MdiIcons.gift, color: Color(0xffffe0b2), size: 32.0),
            onPressed: () 
              _launchURL();
            ,
          ),
        ]),
    backgroundColor: Colors.lightBlue,
    elevation: 50.0,
  ), //AppBar

  body: Container(
    width: MediaQuery.of(context).size.width,
    child: StreamBuilder(
        stream: firestoreDb,
        builder: (context, snapshot) 
          if (!snapshot.hasData) Text('Loading...');
          return StaggeredGridView.countBuilder(
            crossAxisCount: 2,
            mainAxisSpacing: 1.0,
            crossAxisSpacing: 1.0,
            padding: EdgeInsets.symmetric(horizontal: 2.0, vertical: 6.0),
            shrinkWrap: true,
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, int index) => Container(
              child: Column(
                children: <Widget>[
                  Card(
                    color: Colors.white,
                    shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(12.0),
                    ),

                    child: Column(children: <Widget>[
                      ListTile(
                        title: Text(
                          '$(snapshot.data.documents[index]['title'])',
                          style: GoogleFonts.lato(
                            fontSize: 20.0,
                            height: 1.2,
                            fontWeight: FontWeight.w500,
                          ),
                          textAlign: TextAlign.center,
                        ),

                        subtitle: Row(
                            mainAxisSize: MainAxisSize.max,
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: <Widget>[
                              Expanded(
                                child: IconButton(
                                  icon: Icon(
                                    Icons.share,
                                    color: Colors.amberAccent,
                                  ),
                                  onPressed: () => Share.share(
                                    '$(snapshot.data.documents[index]['title'])',
                                  ),
                                ),
                              ),

                              Expanded(
                                child: IconButton(
                                  onPressed: () => setState(() =>
                                  _isFavorited[index] =
                                  !_isFavorited[index]),
                                  icon: _isFavorited[index]
                                      ? Icon(MdiIcons.heart,color: Colors.red)
                                      : Icon(MdiIcons.heartOutline,color: Colors.red,),
                                ),
                              ),

                              Expanded(
                                child: Text(
                                  '$(snapshot.data.documents[index]['subtitle'])',
                                  textAlign: TextAlign.right,
                                  style: GoogleFonts.lato(
                                    fontSize: 13.0,
                                    fontWeight: FontWeight.w900,
                                    fontStyle: FontStyle.italic,
                                    color: Colors.blue,
                                  ),
                                ), //subtitle: Text
                              ),
                            ] //children
                        ), //Row
                      ), //listtile
                    ]),
                  ),
                ],
              ),
            ),
            staggeredTileBuilder: (int index) => StaggeredTile.fit(2),
          );
        ),
  ),
);
 //build
 //class

_launchURL() async 
const url = 'https://amazon.com';
if (await canLaunch(url)) 
await launch(url);
 else 
throw 'Could not launch $url';


【问题讨论】:

【参考方案1】:

您必须为所有ListTiles 维护_isFavorited 的值。所以bool _isFavorited 应该是List&lt;bool&gt; _isFavorited。然后可以修改 IconButton 的逻辑如下:

Expanded(
    child: IconButton(
        icon: _isFavorited[index]
            ? Icon(Icons.star)
            : Icon(Icons.star_border),                     
        onPressed: () => setState(() => _isFavorited[index] = !_isFavorited[index]),
    ), 
),

我在DartPad上为此创建了一个示例演示

【讨论】:

所以把 _isfavorited 变成一个列表并添加 .generate?我没有意识到这一点,两天试图弄清楚,你让它看起来很容易。谢谢你。如何将我的项目长度整合到 itemCount , itemCount: snapshot.data.documents.length 到 static final int _itemLength = 20; 不客气。我很高兴能帮上忙。 snapshot.data.documentsFutureBuilder 的一部分? 我将 StreamBuilder 与 firestore 数据一起使用,我为 static final int _itemLength 返回的所有内容都会出错。 我已经使用 StreamBuilder 更新了 DartPad。您可以根据需要调整代码。 如果我在_itemLength =snapshot.data.length,snapshot.data.documents.length中使用任何组合;等等,总是说第一个项目没有定义,但我使用 itemCount: snapshot.data.documents.length 作为我的 StreamBuilder 数据。我错过了什么,是一种不必在代码中再次定义项目长度的方法,我仍然无法让它工作。

以上是关于如何使用 onPressed 为选择的收藏图标选择单个颤振 ListTiles?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作ico图标

如何为 dataTable 中的不同操作选择图像?

图标的 TouchableOpacity 和 onPress

如何让用户为他们要添加的内容选择图标?

ue4蓝图类的事件图标是只读,无法编辑怎么办 只看楼主收藏回复

onPressed上的图标没有改变