Слайдер изображений карусели Flutter открыть отдельную страницу во время на кран - PullRequest
0 голосов
/ 30 января 2020

Я с нетерпением жду, чтобы открыть изображение при нажатии уточняющего c изображения. Я просто могу открыть первое изображение при нажатии на него. Я не могу открыть другое изображение. Я хочу открыть изображение, на которое нажали. Как я могу иметь отдельную страницу для другого изображения клика. Например, у меня есть пять изображений в моем слайдере карусели флаттера. Изображение 1 откроет страницу слайдера 1. Изображение 2 откроет страницу слайдера 2 и так далее

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

    void main() => runApp(MaterialApp(home: Demo()));

    class Demo extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }

    class _HomePageState extends State<Demo> {
      @override
      Widget build(BuildContext context) {
        Widget image_carousel = new Container(
            height: 345.0,
            child: CarouselSlider(
              height: 400.0,
              items: [
                'http://pic3.16pic.com/00/55/42/16pic_5542988_b.jpg',
                'http://photo.16pic.com/00/38/88/16pic_3888084_b.jpg',
                'http://pic3.16pic.com/00/55/42/16pic_5542988_b.jpg',
                'http://photo.16pic.com/00/38/88/16pic_3888084_b.jpg'
              ].map((i) {
                return Builder(
                  builder: (BuildContext context) {
                    return Container(
                        width: MediaQuery.of(context).size.width,
                        margin: EdgeInsets.symmetric(horizontal: 5.0),
                        decoration: BoxDecoration(color: Colors.amber),
                        child: GestureDetector(
                            child: Image.network(i, fit: BoxFit.fill),
                            onTap: () {
                              Navigator.push<Widget>(
                                context,
                                MaterialPageRoute(
                                  builder: (context) => ImageScreen(i),
                                ),
                              );
                            }));
                  },
                );
              }).toList(),
            ));

        return Scaffold(
          body: new Column(
            children: <Widget>[
              image_carousel,
            ],
          ),
        );
      }
    }

    Next page called screen.dart

    import 'package:flutter/material.dart';

    class ImageScreen extends StatefulWidget {
      final String url;
      ImageScreen(this.url);

      @override
      _MyImageScreen createState() => _MyImageScreen(url);
    }

    class _MyImageScreen extends State<ImageScreen> {
      final String url;
      _MyImageScreen(this.url);
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text('ImageScreen'),
            ),
            body: Image.network(url, width: double.infinity));
      }
    }

1 Ответ

0 голосов
/ 31 января 2020

Вы можете скопировать вставленный полный код ниже
Вы можете использовать route и Navigator.pushNamed для передачи аргумента

фрагмент кода

routes: {
          '/': (context) => Demo(),
          '/first': (context) => FirstScreen(),
          '/second': (context) => SecondScreen(),
        });

...

items: [
            {
              "url": 'https://pic3.16pic.com/00/55/42/16pic_5542988_b.jpg',
              "routeName": "/first"
            },  
...

Widget build(BuildContext context) {
    final Map args = ModalRoute.of(context).settings.arguments;
    return Scaffold(
        appBar: AppBar(
          title: Text('First Screen'),
        ),
        body: Image.network(args["url"], width: double.infinity));          

рабочая демонстрация

enter image description here

полный код

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        //home: Demo(),
        initialRoute: '/',
        routes: {
          '/': (context) => Demo(),
          '/first': (context) => FirstScreen(),
          '/second': (context) => SecondScreen(),
        });
  }
}

class Demo extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<Demo> {
  @override
  Widget build(BuildContext context) {
    Widget image_carousel = new Container(
        height: 345.0,
        child: CarouselSlider(
          height: 400.0,
          items: [
            {
              "url": 'https://pic3.16pic.com/00/55/42/16pic_5542988_b.jpg',
              "routeName": "/first"
            },
            {
              "url": 'https://photo.16pic.com/00/38/88/16pic_3888084_b.jpg',
              "routeName": "/second"
            },
            {
              "url": 'https://pic3.16pic.com/00/55/42/16pic_5542988_b.jpg',
              "routeName": "/first"
            },
            {
              "url": 'https://photo.16pic.com/00/38/88/16pic_3888084_b.jpg',
              "routeName": "/second"
            },
          ].map((i) {
            return Builder(
              builder: (BuildContext context) {
                return Container(
                    width: MediaQuery.of(context).size.width,
                    margin: EdgeInsets.symmetric(horizontal: 5.0),
                    decoration: BoxDecoration(color: Colors.amber),
                    child: GestureDetector(
                        child: Image.network(i["url"], fit: BoxFit.fill),
                        onTap: () {
                          print('i $i');
                          Navigator.pushNamed(
                            context,
                            i["routeName"],
                            arguments: i,
                          );
                        }));
              },
            );
          }).toList(),
        ));

    return Scaffold(
      body: new Column(
        children: <Widget>[
          image_carousel,
        ],
      ),
    );
  }
}

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  Widget build(BuildContext context) {
    final Map args = ModalRoute.of(context).settings.arguments;
    return Scaffold(
        appBar: AppBar(
          title: Text('Second Screen'),
        ),
        body: Image.network(args["url"], width: double.infinity));
  }
}

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  @override
  Widget build(BuildContext context) {
    final Map args = ModalRoute.of(context).settings.arguments;
    return Scaffold(
        appBar: AppBar(
          title: Text('First Screen'),
        ),
        body: Image.network(args["url"], width: double.infinity));
  }
}
...