flutter - 无法使用外部小部件设置状态

标签 flutter dart

我正在使用 flutter 并尝试在点击图标时更改图标的状态(切换图标)。如果一切都在同一个类(class),这很好用。但是我在重复的页面上重复了小部件的一部分,因此我已经将该小部件移到了另一个类中。现在,当我尝试通过传入一个函数来设置状态时,基于调试步骤,看起来它工作正常但状态保持不变(图标没有改变)。我能知道我做错了什么吗?谢谢。

这是我从另一个类调用小部件并传入函数以设置状态的类。

class _MyPageState extends State<MyPage> {
  IconData heartStatus = FontAwesomeIcons.heart;

  void setFav(){
    print('clicked');
    setState(() {
      if (heartStatus == FontAwesomeIcons.heart) {
        heartStatus = FontAwesomeIcons.solidHeart;
      } else {
        heartStatus = FontAwesomeIcons.heart;
      }
    });
  }

  @override
  Widget build(BuildContext context) {

    Page page = new Page();
    PageController controller = PageController();

    return Scaffold(
      backgroundColor: Colors.blue,
      body: SafeArea(
        child: PageView(
          children: <Widget>[
            // this is the external widget repeated 3 times. Each time passing in setFav which is the setState function. 
            page.getPageData("text 1", "", setFav),
            page.getPageData("text 2", "", setFav),
            page.getPageData("text 3", "", setFav),
          ],
        ),
      ),
    );
  }
}

这是通过 page.getPageData 提供小部件的类(我已经删除了很多嵌套小部件以专注于对这个设置状态问题很重要的小部件,即图标)。

class Page{

  Widget getPageData(String question, String answer, Function setFav){
    IconData heartStatus = FontAwesomeIcons.heart;
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              GestureDetector(
                child: Icon(heartStatus),
                onTap: () {
                  setFav();
                },
              ),
              GestureDetector(
                child: Icon(FontAwesomeIcons.shareAlt),
                onTap: () {
                  print('shared');
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

最佳答案

您正在提供 setFav 方法,该方法调用 setState 来更改 MyPage 小部件中的图标。

我认为您的目标是更改从 getPageData 方法返回的小部件中的图标。

使用 setFav 方法更改 MyPage 中的图标后,您没有使用此图标。 PageView 中的小部件未使用该图标。

我强烈建议您使用小部件,而不是函数。 https://iirokrankka.com/2018/12/11/splitting-widgets-to-methods-performance-antipattern/

class Page extends StatelessWidget {
  Page({this.changeIcon, this.heartStatus});

  Function changeIcon;
  IconData heartStatus;
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              GestureDetector(
                child: Icon(heartStatus),
                onTap: () {
                  changeIcon();
                },
              ),
              GestureDetector(
                child: Icon(FontAwesomeIcons.shareAlt),
                onTap: () {
                  print('shared');
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

...

child: PageView(
          children: <Widget>[
            // this is the external widget repeated 3 times. Each time passing in setFav which is the setState function. 
            Page(heartStatus,setFav);
            Page(heartStatus,setFav);
            Page(heartStatus,setFav);
          ],
        ),

关于flutter - 无法使用外部小部件设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57609300/

相关文章:

android - 当我运行 `flutter run` 时 java.lang.StackOverflowError (无错误消息)

web-services - 如何在 flutter 中使用 FedEx Web 服务

dart - 是否可以将声音保存在本地存储中-Flutter

Flutter 容器布局行为

flutter - 如何让 flutter run -d chrome 使用 https?

dart - 如何在带有 Flutter 的可 ScrollView 中拥有具有可变高度内容的 TabView?

Flutter Web、Riverpod 和 GoRouter,如何从 GoRouter 中访问状态通知程序

flutter - Flushbar编译器问题

flutter - 小部件测试失败,未找到任何 MediaQuery 小部件

flutter - 来自 Flutter Web 的 HTTP Post 请求