как я могу вызвать событие после подключения контроллера прокрутки

#flutter #dart #flutter-dependencies

#флаттер #dart #флаттер-зависимости

Вопрос:

 @override
  void initState()
 {
    super.initState();
    _scrollController = ScrollController(initialScrollOffset: 0);
    _scrollController.addListener((_scrollControllerInitiated));
}

void _scrollControllerInitiated()
{
_scrollController.jumpto(1000);
}
 

необходимо вызвать метод _scrollControllerInitiated после подключения контроллера прокрутки

Комментарии:

1. что будет внутри _scrollControllerInitiated?

2. необходимо перейти к определенному смещению после подключения scrollcontroller

3. и в чем проблема с текущим подходом?

4. scrollistener запускается после того, как я прокручиваю только изображение (_scrollControllerInitiated) метод, вызываемый после прокрутки страницы, мне нужно вызвать метод сразу после подключения scrollcontroller.

5. затем также добавьте код изображения

Ответ №1:

что _scrollController.addListener делает, так это прослушивает любое событие прокрутки и вызывает зарегистрированную функцию обратного вызова. Если вы закрываете прокрутку для перехода к определенному смещению после подключения к ListView или любому виджету с возможностью прокрутки, вы должны использовать WidgetsBinding.instance.addPostFrameCallback для регистрации функции обратного вызова после создания виджетов. Проверьте приведенный ниже код

 import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  _MyApp createState() => _MyApp();
}

class _MyApp extends State<MyApp> {
  ScrollController _scrollController;

  void _scrollControllerInitiated() {
    _scrollController.animateTo(200,
        duration: Duration(milliseconds: 500), curve: Curves.ease);
  }

  Widget _itemBuilder(BuildContext context, int index) {
    return GestureDetector(
      onTap: () => setState(() {
        print("hello $index");
      }),
      child: Container(
        padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15),
        child: Text("Box $index"),
      ),
    );
  }

  void initState() {
    super.initState();

    _scrollController = ScrollController();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _scrollControllerInitiated();
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Scroll Test"),
        ),
        body: ListView.builder(
          itemBuilder: _itemBuilder,
          itemCount: 200,
          controller: _scrollController,
        ),
      ),
    );
  }
}
 

Ответ №2:

Попробуйте это.

 void _scrollControllerInitiated() {
  Future(() => _scrollController.jumpTo(1000));
}
 

Комментарии:

1. он вызывается после прокрутки только изображения., мне нужно вызвать это сразу после подключения контроллера прокрутки.

2. @AllwinVinosh Это будет вызвано после того, как все будет выложено (что означает, что ваш контроллер был присоединен к ListBody). Я не использую Future.delayed , его обычный Future