Сброс Flutter CustomScrollView при изменении состояния - PullRequest
1 голос
/ 28 мая 2019

Я строю календарь с вертикальной прокруткой, и я реализовал свои дни как несколько SliverList с, чтобы я мог начать с определенного дня, сосредоточенного, при этом все еще есть дни в прошлом и будущем.

Проблема в том, что когда focusDate изменяется посредством изменения состояния в родительском элементе, список корректно обновляет даты, но сохраняет свою позицию прокрутки.Например, если я прокручиваюсь до верхней части списка, то измените focusDate обновление дней, но я все еще наверху списка.

Я ищу, чтобы полностью заменитьсписок (не только дни), когда меняется focusDate.Это происходит, когда дата выбирается из выбора даты.Таким образом, в любом случае необходимо будет получать новые данные, а новый CustomScrollView можно создать и сфокусировать на правильном дне.

import 'package:flutter/material.dart';

import 'day.dart';

class DaysManager extends StatelessWidget {
  List<Day> days;

  DaysManager({DateTime focusDate}) {
    final DateTime startDate = focusDate.subtract(Duration(days: 30));
    days = List.generate(61, (int index) {
      return Day(
        date: startDate.add(Duration(days: index)),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return _buildScrollView();
  }

  CustomScrollView _buildScrollView() {
    final focusKey = ValueKey('focus');

    return CustomScrollView(
      center: focusKey,
      slivers: <Widget>[
        SliverList(
          delegate: SliverChildListDelegate(
            days.sublist(0, 31).reversed.toList(),
          ),
        ),
        SliverList(
          key: focusKey,
          delegate: SliverChildListDelegate(
            days.sublist(31, 32),
          ),
        ),
        SliverList(
          delegate: SliverChildListDelegate(
            days.sublist(32),
          ),
        ),
      ],
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2019
        ScrollController _scrollController;
        @override
        void initState() {
          super.initState();
          _scrollController = new ScrollController();
        }

        @override
        Widget build(BuildContext context) {
          return ListView.builder(itemBuilder: (context, index){
            return FlatButton(onPressed: (){
              _scrollController.animateTo(index*(YOUR_VIEW_HEIGHT), duration: new Duration(seconds: 2), curve: Curves.ease);
            }, child: Text("Item   $index"));
          }, controller: _scrollController,);
        }
0 голосов
/ 28 мая 2019

Вы можете добавить ScrollController в свой CustomListView. А когда вы устанавливаете свое состояние, используйте контроллер для анимации в положение, которое вы только что выбрали.

ScrollController имеет метод:

Future<Void> animateTo(
  double offset, {
  @required Duration duration,
  @required Curve curve,
})

Где смещение - это позиция, которую вы хотите анимировать.

...