【问题标题】:How to add refresh indicator outside stream builder flutter如何在流构建器颤动之外添加刷新指示器
【发布时间】:2020-09-29 13:14:39
【问题描述】:

我正在尝试在我的流构建器小部件中添加拉动刷新。这是我迄今为止尝试过的部分代码

@override
  Widget build(BuildContext context) {
    return RefreshIndicator(
      key: _refreshIndicatorKey,
      onRefresh: _handleRefresh,
      child: StreamBuilder<DataModel>(
          stream: dataBloc.subject.stream,
          builder: (context, AsyncSnapshot<DataModel> snapshot) {
            if (snapshot.hasData) {
              return passData(snapshot.data);
            } else if (snapshot.hasError) {
              return .....
            } else {
              return ......
            }
          }),
    );
  }

Future<void> _handleRefresh() async {
    try {
      bool trustSelfSigned = true;
      HttpClient httpClient = new HttpClient()
        ..badCertificateCallback =
            ((X509Certificate cert, String host, int port) => trustSelfSigned);
      IOClient http = new IOClient(httpClient);
      final response = await http.post('...',
          headers: {
            HttpHeaders.contentTypeHeader: 'application/json',
          },
          body: json.encode({...}));
      Map<String, dynamic> responseJson = json.decode(response.body);
      return;
    } catch (ex) {
      print(ex.message);
    }
  }

但是每当我尝试向下滑动时...我看不到刷新指示器的重新加载图标..我应该添加更多内容吗? 我也添加了这段代码

final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
      GlobalKey<RefreshIndicatorState>();

【问题讨论】:

    标签: flutter refresh stream-builder


    【解决方案1】:

    您需要将刷新指示器放在流构建器中:

        @override
        Widget build(BuildContext context) {
            return StreamBuilder<DataModel>(
            stream: dataBloc.subject.stream,
                builder: (context, AsyncSnapshot<DataModel> snapshot) {
                    if (snapshot.hasData) {
                        return Expanded(
                            child: RefreshIndicator(
                                child: methodToHandleTheData(snapshot.data)
                            )
                        );
                    } else if (snapshot.hasError) {
                        return .....
                    } else {
                        return ......
                    }
                }
            );
        }
    
        Widget methodToHandleTheData(DataModel data) {
            return SingleChildScrollView(
                physics: const AlwaysScrollableScrollPhysics(),
                child: MyAwesomeWidget(data)
            );
        }
    

    RefreshIndicator 的第一个孩子必须是可滚动的小部件,即 SingleChildScrollView 或 ListView,并且您需要添加参数 physics: const AlwaysScrollableScrollPhysics() 才能使其工作。

    【讨论】:

      【解决方案2】:

      过去,当我在返回到构建器的 ListView 中分配了错误配置的 ScrollController 时,我遇到了这个问题。移除 ScrollController 后,会显示循环刷新指示器,并调用 onRefresh。

      我不必使用 SingleChildScrollView

      【讨论】:

      • 因为你使用了ListView,所以我们可以使用任何可滚动的widget
      【解决方案3】:

      是的,您需要一个可滚动的孩子。在 RefreshIndicator 之后放置一个 SingleChildScrollView,它应该可以工作

      【讨论】:

      • 我已经添加了此代码return SingleChildScrollView(child: passData(snapshot.data));,但我仍然得到相同的结果...有什么我想念的吗?
      • 不,在 RefreshIndicator 之后,streambuilder 之前添加它
      • 嗨..我刚刚添加了这段代码RefreshIndicator( onRefresh: _refreshLocalGallery, key: _refreshIndicatorKey, child: SingleChildScrollView()但我仍然得到相同的结果..有什么问题
      猜你喜欢
      • 2021-11-20
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2023-03-03
      • 1970-01-01
      • 2019-05-31
      • 2021-06-28
      相关资源
      最近更新 更多