Почему List-View Builder возвращает дочерние элементы с фиксированной высотой и шириной в виджете SmartRefresher? - PullRequest
0 голосов
/ 08 марта 2020

Я использую пакет pull-to-refre sh , и с помощью виджета SmartRefresher я не могу изменить высоту или ширину дочерних элементов конструктора List-View. Это всегда дает мне детей с полноэкранной шириной и фиксированной высотой.

Я знаю, что проблема в том, что я использую SmartRefresher, но как я могу ее решить?

SmartRefresher(
      enablePullDown: true,
      enablePullUp: true,
      header: BezierCircleHeader(
        bezierColor: Colors.deepPurpleAccent,
        enableChildOverflow: false,
      ),
      footer: CustomFooter(
        builder: (BuildContext context, LoadStatus mode) {
          Widget body;
          if (mode == LoadStatus.idle) {
            body = Text("pull up load");
          } else if (mode == LoadStatus.loading) {
            body = CircularProgressIndicator();
          } else if (mode == LoadStatus.failed) {
            body = Text("Load Failed!Click retry!");
          } else if (mode == LoadStatus.canLoading) {
            body = Text("release to load more");
          } else {
            body = Text("No more Data");
          }
          return Container(
            height: 55.0,
            child: Center(child: body),
          );
        },
      ),
      controller: _refreshController,
      onRefresh: _onRefresh,
      onLoading: _onLoading,
      child: ListView.builder(
          itemCount: items.length,
          itemExtent: 100.0,
          itemBuilder: (ctx, i) {
Container(
                  width: 50,
                  height: 600,)
          }

Это дает мне этот интерфейс:

ScreenShot

И я хочу что-то вроде этого:

ScreenShot

Ps: я не могу прекратить использовать Pull-to-refre sh

1 Ответ

1 голос
/ 09 марта 2020

Вы можете скопировать код вставки и выполнить полный код ниже
Вы можете удалить itemExtent

фрагмент кода

ListView.builder(
                padding: const EdgeInsets.all(8),
                //itemExtent: 100,
                itemCount: items.length,
                itemBuilder: (BuildContext context, int index) {
                  return Container(
                    height: 400,
                    color: Colors.blue,
                    child: Card(child: Text('Entry ${items[index]}')),
                  );
                })

рабочая демонстрация

enter image description here

полный код

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> items = ["1", "2", "3", "4", "5", "6", "7", "8"];
  RefreshController _refreshController =
      RefreshController(initialRefresh: false);

  void _onRefresh() async {
    // monitor network fetch
    await Future.delayed(Duration(milliseconds: 1000));
    // if failed,use refreshFailed()
    _refreshController.refreshCompleted();
  }

  void _onLoading() async {
    // monitor network fetch
    await Future.delayed(Duration(milliseconds: 1000));
    // if failed,use loadFailed(),if no data return,use LoadNodata()
    items.add((items.length + 1).toString());
    if (mounted) setState(() {});
    _refreshController.loadComplete();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: SmartRefresher(
            enablePullDown: true,
            enablePullUp: true,
            header: WaterDropHeader(),
            footer: CustomFooter(
              builder: (BuildContext context, LoadStatus mode) {
                Widget body;
                if (mode == LoadStatus.idle) {
                  body = Text("pull up load");
                } else if (mode == LoadStatus.loading) {
                  body = CircularProgressIndicator();
                } else if (mode == LoadStatus.failed) {
                  body = Text("Load Failed!Click retry!");
                } else if (mode == LoadStatus.canLoading) {
                  body = Text("release to load more");
                } else {
                  body = Text("No more Data");
                }
                return Container(
                  height: 55.0,
                  child: Center(child: body),
                );
              },
            ),
            controller: _refreshController,
            onRefresh: _onRefresh,
            onLoading: _onLoading,
            child: ListView.builder(
                padding: const EdgeInsets.all(8),
                //itemExtent: 100,
                itemCount: items.length,
                itemBuilder: (BuildContext context, int index) {
                  return Container(
                    height: 400,
                    color: Colors.blue,
                    child: Card(child: Text('Entry ${items[index]}')),
                  );
                })));
  }
}
...