Flutter: как перемещать горизонтальную прокрутку влево и вправо при нажатии кнопки «Предыдущий» и «Вперед»

#flutter #listview #dart #button #scroll

#flutter #listview #dart #кнопка #прокрутка

Вопрос:

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

 class ScrolllingOnClickButton extends StatefulWidget {
  @override
  _ScrolllingOnClickButtonState createState() => _ScrolllingOnClickButtonState();
}

class _ScrolllingOnClickButtonState extends State<ScrolllingOnClickButton> {
  @override
  Widget build(BuildContext context) {
    var sizeDevice = MediaQuery.of(context).size;

    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: <Widget>[
            Expanded(
                flex: 1,
                child: Container(
                  color: Colors.green,
                )),
            Expanded(
                flex: 2,
                child: Row(
                  children: <Widget>[
                    ClipOval(
                      child: Material(
                        color: Colors.blue,
                        child: InkWell(
                          splashColor: Colors.red,
                          child: SizedBox(
                              width: 56,
                              height: 56,
                              child: Icon(Icons.arrow_back)),
                          onTap: () {},
                        ),
                      ),
                    ),
                    Expanded(
                        flex: 2,
                        child: Container(
                          color: Colors.transparent,
                        )),
                    ClipOval(
                      child: Material(
                        color: Colors.blue,
                        child: InkWell(
                          splashColor: Colors.red,
                          child: SizedBox(
                              width: 56,
                              height: 56,
                              child: Icon(Icons.arrow_forward)),
                          onTap: () {},
                        ),
                      ),
                    ),
                  ],
                )),
            Expanded(
              flex: 16,
              child: Container(
                child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    physics: PageScrollPhysics(),
                    itemCount: word_data.drink.length,
                    itemBuilder: (BuildContext context, int index) {
                      return Container(
                        child: Column(
                          children: <Widget>[
                            Expanded(
                                flex: 6,
                                child: GestureDetector(
                                  onTap: () {},
                                  child: Container(
                                    color: Colors.purple,
                                    child: Padding(
                                      padding: const EdgeInsets.all(10.0),
                                      child: Image.asset(
                                        "asset/drink_images/"  
                                            word_data.drink[index]  
                                            ".png",
                                        fit: BoxFit.contain,
                                      ),
                                    ),
                                  ),
                                )),
                          ],
                        ),
                        width: sizeDevice.width,
                      );
                    }),
                color: Colors.yellow,
              ),
            ),
            Expanded(
                flex: 2,
                child: Container(
                  color: Colors.lightBlueAccent,
                ))
          ],
        ),
      ),
    );
  }
}
  

Ответ №1:

Я рекомендую использовать этот пакет carousel_slider. Это сэкономит вам много времени на реализацию поведения ползунка.

Я создал образец приложения для тестирования:

 import 'package:carousel_slider/carousel_options.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';

void main() => runApp(CarouselDemo());

class CarouselDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: BasicDemo());
  }
}

class BasicDemo extends StatelessWidget {
  final controller = CarouselController();

  @override
  Widget build(BuildContext context) {
    List<int> list = [1, 2, 3, 4, 5];
    return Scaffold(
      appBar: AppBar(title: Text('Basic demo')),
      body: Container(
          height: 400,
          child: Column(
            children: [
              Expanded(
                child: CarouselSlider(
                  carouselController: controller,
                  options: CarouselOptions(),
                  items: list
                      .map((item) => Container(
                            child: Center(child: Text(item.toString())),
                            color: Colors.green,
                          ))
                      .toList(),
                ),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  IconButton(
                      icon: Icon(Icons.arrow_back_ios),
                      onPressed: () => controller.previousPage()),
                  IconButton(
                      icon: Icon(Icons.arrow_forward_ios),
                      onPressed: () => controller.nextPage())
                ],
              )
            ],
          )),
    );
  }
}