【问题标题】:Flutter carousel image slider open separate page during on tap颤动轮播图像滑块在点击时打开单独的页面
【发布时间】:2020-01-30 17:25:45
【问题描述】:

我期待在单击特定图像时打开图像。我只能在单击时打开第一张图片。我无法打开其他图像我想打开单击的图像。我怎样才能有一个单独的页面用于不同的图像点击。例如,我的颤动轮播滑块中有五个图像。图片 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));
      }
    }

【问题讨论】:

    标签: flutter flutter-layout flutter-animation


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    您可以使用route 和Navigator.pushNamed 来传递参数

    代码sn-p

    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));          
    

    工作演示

    完整代码

    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));
      }
    }
    

    【讨论】:

    • 很高兴为您提供帮助。如果对您有帮助,请将其标记为答案。谢谢。
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多