flutter 下拉刷新上拉加载 另外还有头部,大头部隐藏小头部显示

1,884 阅读1分钟

建立一个(design)_adapter.dart 里面class DesignListAdapter extends PullLoadWidget

class _DesignListAdapterState extends PullLoadWidgetState

@override itemView(DynamicListItem data) 这里写item布局

import 'package:flutter/material.dart';

class PullLoadWidget extends StatefulWidget {
  @override
  _PullLoadWidgetState createState() => _PullLoadWidgetState();
}

class _PullLoadWidgetState extends State<PullLoadWidget> {
  int _i = 1;
  ScrollController _scrollController;

  @override
  void initState() {
    _scrollController = ScrollController();
    _scrollController.addListener(() {
      if (_scrollController.position.maxScrollExtent ==
          _scrollController.position.maxScrollExtent) {
        _i++;
        setState(() {});
      }
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return RefreshIndicator(
      onRefresh: _handleRefresh,
      child: ListView.builder(
        itemBuilder: (context, index) {
          return _getItem(index);
        },
        itemCount: 20 * _i,
        controller: _scrollController,
      ),
    );
  }

  _getItem(int index) {
    return Text('$index');
  }

  Future<void> _handleRefresh() async {
    print('refresh');
  }
}

import 'package:flutter/material.dart';

class PullLoadWidget extends StatefulWidget {
  @override
  _PullLoadWidgetState createState() => _PullLoadWidgetState();
}

class _PullLoadWidgetState extends State<PullLoadWidget> {
  int _i = 1;
  ScrollController _scrollController;
  double _navAlpha = 0;

  @override
  void initState() {
    _scrollController = ScrollController();
    _scrollController.addListener(() {
      double offset = _scrollController.offset;
      if (offset == _scrollController.position.maxScrollExtent) {
        _loadMore();
      } else {
        _changeHead(offset);
      }
    });
    super.initState();
  }

  void _loadMore() {
    _i++;
    setState(() {});
  }

  _changeHead(double offset) {
    if (offset < 0) {
      if (_navAlpha != 0) {
        _navAlpha = 0;
        setState(() {});
      }
    } else if (offset < 50) {
      _navAlpha = 1 - (50 - offset) / 50;
      setState(() {});
    } else if (_navAlpha != 1) {
      _navAlpha = 1;
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        _listView(),
        _buildNavigationBar(),
      ],
    );
  }

  _buildNavigationBar() {
    return Opacity(
      opacity: _navAlpha,
      child: Container(
        color: Colors.green,
        width: 360,
        child: Text("-----"),
      ),
    );
  }

  _listView() {
    return RefreshIndicator(
      onRefresh: _handleRefresh,
      child: ListView.builder(
        itemBuilder: (context, index) {
          return _getItem(index);
        },
        itemCount: 20 * _i,
        controller: _scrollController,
      ),
    );
  }

  _getItem(int index) {
    if (index == 0) {
      return Container(
        color: Colors.white,
        height: 200,
        width: 360,
        child: Text('100'),
      );
    }
    return Text('$index');
  }

  Future<void> _handleRefresh() async {
    print('refresh');
  }
}