如何解决Flutter图标不更新
我得到一个奇怪的错误。我有多个页面/类,用户可以在其中单击页面中元素的“收藏夹”图标,一旦完成,所选元素就会出现在“收藏夹”页面/类中。然后,用户可以进入“收藏夹”类(如果需要),然后单击以从该页面中删除该元素。完成此操作后,我还想通过将喜欢的图标(红色实心)更改为其先前状态(空心白心)来说明元素的源页面中的此更改(与之同步)。从收藏夹页面删除收藏夹图标后,我所面临的问题是用于将收藏夹图标重置为其源页面中的正常功能。有趣的是,在我拥有的7个类/页面中,该代码似乎可以完美地用于其中的2个,而其余5个则不起作用(类之间共享的代码几乎相同)。
我检查了每个源类中的“更新函数”(unfavor ** Icon)是否已被最喜欢的类成功调用,并且看来那里没有问题。为了进一步说明我的问题,我在下面添加了简化的类(每个类中的单个元素)版本。第一个代码段是有效的代码段,而第二个代码段是具有喜欢的Icon且不会更新的代码段。
工作代码:
import 'package:flutter/material.dart';
import 'package:/favorites.dart';
import 'package:/play.dart';
import 'package:/main.dart';
class Human extends StatefulWidget{
MyApp createState() => MyApp();
}
Icon fly = new Icon(Icons.favorite_border,color: Colors.white,size: 30.0);
Icon favNotClicked() {
return Icon(Icons.favorite_border,size: 30.0);
}
Icon favClicked() { // to change the fav element once clicked
return Icon(Icons.favorite,color: Colors.red,size: 30.0);
}
unfavorHumanIcon(String element){
switch(element){
case "Fly": {fly = favNotClicked();}
break;
}
}
class MyApp extends State<Human> with AutomaticKeepAliveClientMixin<Human> {
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,title: Text("Humans"),),body: GridView.count(
shrinkWrap: true,padding: const EdgeInsets.all(20),crossAxisCount: 2,crossAxisSpacing: 10.0,mainAxisSpacing: 10.0,childAspectRatio: 1,children: <Widget> [
Container(
child: Column(
children: [
Image.asset('fly.jpg'),Text("Fly",style: TextStyle(
color: Colors.white,fontWeight: FontWeight.bold,fontSize: 18),Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[
new InkWell(
onTap: (){
setPlay(new AudioMetadata(name: "Fly"));
},child: Icon(
Icons.playlist_add,size: 30.0,new InkWell(
onTap: (){
playAudioAllClass('human1');
},onLongPress: () {
globalPlayer.stop();
},child: Icon(
Icons.play_circle_outline,new InkWell(
onTap: (){
setFavList(new FavElement(imagePath: 'human1',name: 'Fly'));
setState(() {
fly= favClicked();
});
},onLongPress: () {
setState(() {
fly= favNotClicked();
remFavListByName('Fly');
});
},child: fly,],]),)
);
}
@override
bool get wantKeepAlive => true;
}
故障代码:
import 'package:flutter/material.dart';
import 'package:/favorites.dart';
import 'package:/play.dart';
import 'package:/main.dart';
class Weather extends StatefulWidget{
MyApp createState() => MyApp();
}
Icon rain = new Icon(Icons.favorite_border,size: 30.0);
favNotClicked() {
return Icon(Icons.favorite_border,size: 30.0);
}
Icon favClicked() { // to change the fav element once clicked
return Icon(Icons.favorite,size: 30.0);
}
unfavorWeatherIcon(String element){
switch(element){
case "Rain": {rain = favNotClicked();}
break;
}
}
class MyApp extends State<Weather> with AutomaticKeepAliveClientMixin<Weather> {
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,title: Text("Weather"),children: <Widget> [
Container(
child: Column(
children: [
Image.asset('rain.jpg'),Text("Rain",children: <Widget>[
new InkWell(
onTap: (){
setPlayList(new AudioMetadata(name: "Rain"));
},new InkWell(
onTap: (){
playAudioAllClass('rain.mp3');
},onLongPress: () {
globalPlayer.stop();
},new InkWell(
onTap: (){ //sets favorite and changes the fav icon
setFavList(new FavElement(imagePath: 'rain.jpg',name: 'Rain'));
setState(() {
rain= favClicked();
});
},onLongPress: () {
setState(() {
rain= favNotClicked();
remFavListByName('Rain');
});
},child: rain,)
);
}
@override
bool get wantKeepAlive => true;
}
在收藏夹类/页面中,下面的代码调用上面片段中的unfavorWeatherIcon和unfavorHumanIcon函数,以更新各个类中的按钮。该代码似乎可以成功调用这些函数,但是对于Weather类仍然无效:
remFavList(int index){
String path = favList.elementAt(index).imagePath;
if (path.contains('human')){
unfavorHumanIcon(favList.elementAt(index).name);
}else if (path.contains('weather')){
unfavorWeatherIcon(favList.elementAt(index).name);
}
favList.remove(favList.elementAt(index));
}
对于如何修复第二个代码段(Weather类)的任何建议,我将不胜感激,以使其像第一个代码段一样工作。
感谢您的时间和预先的帮助:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。