首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振FutureBuilder叫了两次

颤振FutureBuilder叫了两次
EN

Stack Overflow用户
提问于 2022-06-27 17:13:50
回答 1查看 172关注 0票数 0

我有一个带有FutureBuilder的页面和一个带有多个FutureBuilders的定制小部件。我的目标是在打开这个页面之后获得未来,但是我的FutureBuilders继续两次调用未来。这是我的页面:

代码语言:javascript
运行
复制
    class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  LoggedUser loggedUser = Cache.getLoggedUser();

  //zobrazení groupchatů
  static Widget showGroupchats(List<Groupchat> list) {
    List<Widget> children = [];

    for (int i = 0; i < list.length; i++) {
      children.add(GroupchatWidget(list[i]));
    }

    return Column(
      children: children,
    );
  }

//widget
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).backgroundColor,
      body: SingleChildScrollView(
        child: SafeArea(
          child: Column(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(top: 15, left: 15),
                    child: FutureBuilder<ImageProvider>(
                      future: Buttons.getUserImage(loggedUser.Id, context),
                      builder: (BuildContext context,
                          AsyncSnapshot<ImageProvider> snapshot) {
                        return CircleAvatar(
                          radius: 20,
                          foregroundImage: snapshot.data,
                          backgroundImage: Settings.DefaultUserImage,
                        );
                      },
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(left: 5, top: 10),
                    child: Text(
                      loggedUser.Username,
                      style: const TextStyle(fontSize: 20),
                    ),
                  ),
                  const Spacer(),
                  Padding(
                    padding: const EdgeInsets.only(top: 15, right: 15),
                    child: IconButton(
                        icon: SvgPicture.asset(
                          'assets/icons/settings.svg',
                          width: 25,
                          height: 25,
                          color: Theme.of(context).textTheme.bodyText1?.color,
                        ),
                        onPressed: null //TODO editace profilu
                        ),
                  ),
                ],
              ),
              Row(
                children: <Widget>[
                  Flexible(
                    flex: 1,
                    child: Padding(
                      padding:
                          const EdgeInsets.only(left: 15, right: 15, top: 15),
                      child: TextField(
                        decoration: InputDecoration(
                          border: const OutlineInputBorder(),
                          hintText: 'groupchatSearch'.tr(),
                          prefixIcon: Container(
                            width: 5,
                            height: 5,
                            padding: const EdgeInsets.all(10),
                            child: SvgPicture.asset('assets/icons/search.svg',
                                color: Theme.of(context)
                                    .textTheme
                                    .bodyText1
                                    ?.color),
                          ),
                        ),
                      ),
                    ),
                  ),
                ],
              ),
              Padding(
                padding: const EdgeInsets.only(left: 15, right: 15, top: 5),
                child: FutureBuilder<List<Groupchat>>(
                  future: Buttons.getGroupchatList(context),
                  builder: (BuildContext context,
                      AsyncSnapshot<List<Groupchat>> snapshot) {
                    if (snapshot.hasData == false) {
                      return Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: const <Widget>[
                          Padding(
                            padding: EdgeInsets.only(top: 15),
                            child: CircularProgressIndicator(),
                          ),
                        ],
                      );
                    } else {
                      return showGroupchats(snapshot.data!);
                    }
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

以及用于驱散聊天的自定义小部件:

代码语言:javascript
运行
复制
class GroupchatWidget extends StatefulWidget {
  Groupchat groupchat;

  @override
  State<GroupchatWidget> createState() => _GroupchatWidgetState();

  GroupchatWidget(this.groupchat, {Key? key}) : super(key: key);
}

class _GroupchatWidgetState extends State<GroupchatWidget> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(top: 5, bottom: 5),
      child: Container(
        decoration: BoxDecoration(
            color: Theme.of(context).focusColor,
            borderRadius: BorderRadius.circular(15)),
        child: ListTile(
          leading: FutureBuilder<ImageProvider>(
            future: Buttons.getGroupchatImage(widget.groupchat.Id, context),
            builder:
                (BuildContext context, AsyncSnapshot<ImageProvider> snapshot) {
              return CircleAvatar(
                radius: 25,
                foregroundImage: snapshot.data,
                backgroundImage: Settings.DefaultGroupchatImage,
              );
            },
          ),
          title: Text(
            widget.groupchat.Name,
            style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
            overflow: TextOverflow.ellipsis,
          ),
          subtitle: FutureBuilder<void>(
            future:
                Buttons.getNewGroupchatMessages(widget.groupchat.Id, context),
            builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
              return Text(
                Cache.getLastMessage(widget.groupchat.Id).Text,
                style: const TextStyle(fontSize: 15),
                overflow: TextOverflow.ellipsis,
              );
            },
          ),
        ),
      ),
    );
  }
}

这是输出:

如何防止两次打电话给未来?我试过this,但它对我不起作用。

EN

Stack Overflow用户

发布于 2022-06-27 17:26:27

尝尝这个

代码语言:javascript
运行
复制
...
late Future<ImageProvider> imageProviderFuture;

  @override
  void initState() {
   
    imageProviderFuture = Buttons.getGroupchatImage(widget.groupchat.Id, context),
    super.initState();
  }
...
//in your build
// future call imageProviderFuture

FutureBuilder<ImageProvider>(
 future: imageProviderFuture,
)

把这个应用到其他地方。指的是这个Link

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72775980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档