Guest User

Untitled

a guest
Apr 24th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. import 'dart:async';
  2.  
  3. import 'package:flutter/material.dart';
  4.  
  5. void main() => runApp(new MyApp());
  6.  
  7. class MyApp extends StatelessWidget {
  8. @override
  9. Widget build(BuildContext context) {
  10. return new MaterialApp(
  11. theme: new ThemeData(primarySwatch: Colors.blue),
  12. home: new MyHomePage(),
  13. );
  14. }
  15. }
  16.  
  17. class MyHomePage extends StatefulWidget {
  18. @override
  19. _MyHomePageState createState() => _MyHomePageState();
  20. }
  21.  
  22. class _MyHomePageState extends State<MyHomePage> {
  23. List<int> items = List.generate(10, (i) => i);
  24. ScrollController _scrollController = new ScrollController();
  25. bool isPerformingRequest = false;
  26.  
  27. @override
  28. void initState() {
  29. super.initState();
  30. _scrollController.addListener(() {
  31. if (_scrollController.position.pixels ==
  32. _scrollController.position.maxScrollExtent) {
  33. _getMoreData();
  34. }
  35. });
  36. }
  37.  
  38. @override
  39. void dispose() {
  40. _scrollController.dispose();
  41. super.dispose();
  42. }
  43.  
  44. _getMoreData() async {
  45. if (!isPerformingRequest) {
  46. setState(() => isPerformingRequest = true);
  47. List<int> newEntries = await fakeRequest(
  48. items.length, items.length + 10); //returns empty list
  49. if (newEntries.isEmpty) {
  50. double edge = 50.0;
  51. double offsetFromBottom = _scrollController.position.maxScrollExtent -
  52. _scrollController.position.pixels;
  53. if (offsetFromBottom < edge) {
  54. _scrollController.animateTo(
  55. _scrollController.offset - (edge - offsetFromBottom),
  56. duration: new Duration(milliseconds: 500),
  57. curve: Curves.easeOut);
  58. }
  59. }
  60. setState(() {
  61. items.addAll(newEntries);
  62. isPerformingRequest = false;
  63. });
  64. }
  65. }
  66.  
  67. Widget _buildProgressIndicator() {
  68. return new Padding(
  69. padding: const EdgeInsets.all(8.0),
  70. child: new Center(
  71. child: new Opacity(
  72. opacity: isPerformingRequest ? 1.0 : 0.0,
  73. child: new CircularProgressIndicator(),
  74. ),
  75. ),
  76. );
  77. }
  78.  
  79. @override
  80. Widget build(BuildContext context) {
  81. return new Scaffold(
  82. appBar: AppBar(
  83. title: Text("Infinite ListView"),
  84. ),
  85. body: ListView.builder(
  86. itemCount: items.length + 1,
  87. itemBuilder: (context, index) {
  88. if (index == items.length) {
  89. return _buildProgressIndicator();
  90. } else {
  91. return ListTile(title: new Text("Number $index"));
  92. }
  93. },
  94. controller: _scrollController,
  95. ),
  96. );
  97. }
  98. }
  99.  
  100. /// from - inclusive, to - exclusive
  101. Future<List<int>> fakeRequest(int from, int to) async {
  102. return Future.delayed(Duration(seconds: 2), () {
  103. return List.generate(to - from, (i) => i + from);
  104. });
  105. }
Add Comment
Please, Sign In to add comment