【问题标题】:Flutter: Dynamic Widget as argument (A) of another widget (B), which Widget (A) receives an argument set on Widget BFlutter:动态 Widget 作为另一个 Widget (B) 的参数 (A),其中 Widget (A) 接收在 Widget B 上设置的参数
【发布时间】:2020-07-18 18:57:38
【问题描述】:

首先,对标题感到抱歉,听起来很乱,但我希望有人已经遇到过这个问题。将尝试解释我要在这里实现的目标。

我正在尝试重用 futureBuilder 小部件,因为我的应用有很多列表。

//flutter
import 'package:flutter/material.dart';

class StreamBuilderWidget extends StatelessWidget {
  Stream streamFunction;
  ScrollController scrollController;
  Widget customWidget;

  StreamBuilderWidget({
    this.streamFunction,
    this.scrollController,
    this.customWidget,
  });

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: streamFunction,
      builder: (context, snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
          case ConnectionState.none:
            return Center(child: CircularProgressIndicator());
          case ConnectionState.active:
          case ConnectionState.done:
            if (snapshot.hasData) {
              return IgnorePointer(
                child: ListView.builder(
                  controller: scrollController,
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    final item = snapshot.data[index];
                    return customWidget(item);
                        //PostItem(item) //example
                        //VideosItem(item) //example
                        //BooksItem(item) //example
                        ;
                  },
                ),
              );
            }
        }
        return Center(
          child: CircularProgressIndicator(),
        );
      },
    );
  }
}


我的头痛来自于 Widget 参数,我需要接收它自己的参数“item”。

在阅读本文时,似乎很容易,虽然我无法解决它。

一个讨厌的解决方法是用一个字符串参数替换小部件参数,将它与 switch 语句一起使用:

switch (widgetType) {
    case 'PostItemWidget':
        return PostItemWidget(post: item);
    case 'YouTubeItemWidget':
        return VideosItem(video: item)
    ... //and so on

你明白了,无论如何,让它成为一个更清晰/更干净的解决方案会很棒。

如果您需要任何进一步的意见,请告诉我。 提前致谢。

【问题讨论】:

    标签: flutter widget arguments


    【解决方案1】:

    代码更新。像这样使用

    final item = snapshot.data
    customWidget(item[index]['name'])
    
    import 'package:flutter/material.dart';
    
    class StreamBuilderWidget extends StatelessWidget {
      Stream streamFunction;
      ScrollController scrollController;
      Widget customWidget;
    
      StreamBuilderWidget({
        this.streamFunction,
        this.scrollController,
        this.customWidget,
      });
    
      @override
      Widget build(BuildContext context) {
        return StreamBuilder(
          stream: streamFunction,
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.waiting:
              case ConnectionState.none:
                return Center(child: CircularProgressIndicator());
              case ConnectionState.active:
              case ConnectionState.done:
                if (snapshot.hasData) {
                  return IgnorePointer(
                    child: ListView.builder(
                      controller: scrollController,
                      itemCount: snapshot.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        final item = snapshot.data;
                        return customWidget(item[index]['name']); ///use like that
                            //PostItem(item[index]) //example
                            //VideosItem(item[index]) //example
                            //BooksItem(item[index]) //example
                            ;
                      },
                    ),
                  );
                }
            }
            return Center(
              child: CircularProgressIndicator(),
            );
          },
        );
      }
    }
    

    【讨论】:

    • 嗨@mr-vd,感谢您的快速重播。不幸的是,这不起作用,因为 customWidget 无法识别参数的输入。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2021-06-04
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多