【问题标题】:How to pass list value to new widget如何将列表值传递给新的小部件
【发布时间】:2021-11-12 23:27:28
【问题描述】:

对于初学者,我有一个带有图像气泡的地图,当点击这些图像时,我试图将 PathImage 的值传递给下面的小部件。基本上试图做到这一点,以便当 onTap 发生时,它会在下面发布的 Hero 小部件中加载图像。我不明白如何正确地将值传递到下面的小部件中。我缺少什么来实现这一点?

import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import "package:latlong2/latlong.dart";
import 'package:location/location.dart';
import 'DetailScreen2.dart';

class CustomMarker extends StatefulWidget {
  double? latitude;
  double? longitude;
  CustomMarker({this.latitude, this.longitude});

  @override
  _MapsPageState createState() => _MapsPageState();
}

class _MapsPageState extends State<CustomMarker> {
  List<Marker> markers = [];
  final Location _location = Location();
  double? userXCoordinate;
  double? userYCoordinate;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getPermission();
    setMarkers();
  }

  void getPermission() async {
    if (widget.latitude == null || widget.longitude == null) {
      bool serviceEnabled = await _location.serviceEnabled();
      if (serviceEnabled == false) {
        await _location.requestPermission();
      } else {
        await getLocation();
      }
    }
  }

  Future<void> getLocation() async {
    //check permission here
    LocationData pos = await _location.getLocation();
    setState(() {
      userXCoordinate = pos.latitude;
      userYCoordinate = pos.longitude;
    });
    //selectedPage = <Widget>[HomePage(stream: stream), MapsPage(latitude: userXCoordinate, longitude: userYCoordinate,),AddPost(camera: widget.camera,),ProfilePage()];
  }

  void setMarkers() {
    Stream<QuerySnapshot> stream =
    FirebaseFirestore.instance.collection("wllmtnnstpphotos").snapshots();
    stream.forEach((element) {
      element.docs.forEach((doc) {
        //add to marker list
        var docData = doc;
        markers.add(
            customMarker(docData["Lat"], docData["Lng"], docData["PathImage"]),
        );
      });
    });
  }

  Marker customMarker(x, y, docData) {
    return Marker(
      width: 30.0,
      height: 30.0,
      point: LatLng(x, y),
      builder: (ctx) => InkWell(
        child: Container(
          color: Colors.transparent,
          child: CircleAvatar(
            backgroundImage: CachedNetworkImageProvider(docData),
            backgroundColor: Colors.transparent,
            maxRadius: 50,
          ),
        ),
        onTap: () {
          MaterialPageRoute route = MaterialPageRoute(
            builder: (context) => DetailScreener2(docData.elementAt(2)["PathImage"]),
          );
          Navigator.push(context, route);
        },
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    var x = widget.latitude;
    var y = widget.longitude;
    return Scaffold(
      body: SafeArea(
          child: x != null || y != null
              ? map()
              : userXCoordinate == null || userYCoordinate == null
              ? loadingPage()
              : map()),
    );
  }

  Widget map() {
    return FlutterMap(
      options: new MapOptions(
          center: LatLng(45.0004173, -123.043808),
          minZoom: 1.0,
          swPanBoundary: LatLng(43.6877, -125.5089),
          nePanBoundary: LatLng(47.7378, -120.6644),
          slideOnBoundaries: true,
          screenSize: MediaQuery.of(context).size,
      ),
      layers: [
        new TileLayerOptions(
            urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
            subdomains: ['a', 'b', 'c']),
        MarkerLayerOptions(markers: markers)
      ],
    );
  }

  Widget loadingPage() {
    return Center(
      child: SpinKitCircle(
        color: Colors.black,
        size: 50.0,
      ),
    );
  }
}


这是我想将 PathImage 的值传递到下面的小部件。

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pinch_zoom/pinch_zoom.dart';

class DetailScreener2 extends StatefulWidget {
  DetailScreener2([docData]);

  @override
  _DetailScreenState createState() => _DetailScreenState();
}

class _DetailScreenState extends State<DetailScreener2> {

  @override
  void initState() {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
    super.initState();
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
  }

  @override
  void dispose() {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
        overlays: SystemUiOverlay.values);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onTap: () {
          Navigator.pop(context);
        },
        child: Container(
          color: Colors.black,
          child: Center(
            child: Hero(
              tag: 'imageHero',
              child: PinchZoom(child: CachedNetworkImage(imageUrl: 'PathImage')),
            ),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    在 customMarker 方法中,docData 变量是图像的路径,但在导航时您正在尝试访问 docData.elementAt(2)['imagepath']。像这样通过 MaterialPageRoute route = MaterialPageRoute( builder: (context) =&gt; DetailScreener2(imagePath : docData), ); 而不是使用 DetailScreener2([docData]) 在 DetailScreener2 中接收它,如下所示 final String imagePath; DetailScreener({required this.imagePath});

    要访问此变量,请使用 CachedNetworkImage(imageUrl: widget.imagePath)

    【讨论】:

    • 非常感谢,我已经能够理解如何使用地图传递值,但不明白如何使用列表进行传递,感谢您非常简洁的解释,它有效完全按照书面规定。
    • 很高兴知道它有效。要接收列表而不是 final String imgPath,您可以使用 final List&lt;dynamic&gt; docData 并将其标记为像 DetailScreener({required this.docData}); 这样的必需,然后您可以传递列表而不是上一页中的字符串
    • 啊,这是一个很大的帮助,而且我构建了一个地图模型并没有完全理解如何让它替换列表并传递值,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2013-03-01
    • 1970-01-01
    • 2020-11-28
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多