#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