WoofnWalk / lib / screens / maps / walkers_list_screen.dart
walkers_list_screen.dart
Raw
import 'package:flutter/material.dart';
import 'package:firebase_database/ui/firebase_animated_list.dart';
import 'package:woofnwalk/providers/walker_caller.dart';
import 'package:woofnwalk/widgets/nav_drawer.dart';

import '../../widgets/walker_widget.dart';
import '../../model/walker.dart';
import '../../model/walker_dao.dart';
import './filter_walkers_screen.dart';

class WalkersList extends StatefulWidget {
  static const routeName = '/walkers-list';

  WalkersList({Key? key}) : super(key: key);

  final walkerDao = WalkerDao();

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

class _WalkersListState extends State<WalkersList> {
  ScrollController _scrollController = ScrollController();
  var futureList;
  List<Walker> origList = [];

  List<Walker> walkerList = [];
  var tmpWidget;
  var listWidget;

  void getList() async {
      WalkerCaller walkerCaller = WalkerCaller();
      futureList = walkerCaller.getWalkers();
      origList = await futureList;
    }

  @override
  void initState() {
    super.initState();
    tmpWidget = _getWalkersList();

    getList();
    setState(() {
      listWidget = tmpWidget;
    });
  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance!.addPostFrameCallback((_) => _scrollToBottom());

    return Scaffold(
        appBar: AppBar(
          title: const Text('Nearby Walkers'),
          actions: <Widget>[
            IconButton(
              icon: const Icon(Icons.restart_alt_sharp),
              onPressed: () {
                setState(() {
                  listWidget = updateList(origList);
                });
              },
            ),
            IconButton(
              icon: const Icon(Icons.filter_alt),
              onPressed: () {
                _navigateAndDisplayFilteredList(context);
              },
            )
          ],
        ),
        drawer: const NavDrawer(),
        body: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(children: [listWidget]
                // showList,
                )));
  }

  Widget _getWalkersList() {
    return Expanded(
        child: FirebaseAnimatedList(
      controller: _scrollController,
      query: widget.walkerDao.getWalkerQuery(),
      itemBuilder: (context, snapshot, animation, index) {
        final json = snapshot.value as Map<dynamic, dynamic>;
        final walker = Walker.fromJson(json);
        return WalkerListWidget(walker: walker);
      },
    ));
  }

  void _scrollToBottom() {
    if (_scrollController.hasClients) {
      _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
    }
  }

  Widget updateList(List<Walker> newList) {
    final GlobalKey<AnimatedListState> _key = GlobalKey();
    var widgetUpdatedList = Expanded(
        child: AnimatedList(
      key: _key,
      initialItemCount: newList.length,
      controller: _scrollController,
      itemBuilder: (context, index, animation) {
        return WalkerListWidget(walker: newList[index]);
      },
    ));
    return widgetUpdatedList;
  }

  void _navigateAndDisplayFilteredList(BuildContext context) async {
    final result = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => FilterWalkersScreen()),
    );

    setState(() {
      if (result != null) {
        walkerList = result;
        listWidget = updateList(walkerList);
      }
    });
  }
}