简体   繁体   中英

Pass parameter to a reusable widget

I'm trying to use a reusable widget, and I would like to send it a parameter from my widget call that would be different for each reuse

    children: 
const [
                      ImageContainer(),
                      ImageContainer(),
                      ImageContainer()
                    ],

I would like to use it here instead of "0.jpg" something like $id.jpg The objective is to get a different photo depending on the widget

class ImageContainer extends StatefulWidget {
  const ImageContainer({Key? key}) : super(key: key);

  @override
  State<ImageContainer> createState() => _ImageContainerState();
}

class _ImageContainerState extends State<ImageContainer> {
  File? image;

  Future pickImage() async {
    try {
      final image = await ImagePicker().pickImage(source: ImageSource.gallery);

      if (image == null) return;

      final imageTemp = File(image.path);

      setState(() => this.image = imageTemp);
      final Directory extDir = await getApplicationDocumentsDirectory();
      String dirPath = extDir.path;
      const fileName = '0';
      final File localImage = await imageTemp.copy('$dirPath/$fileName.jpg');
      print(localImage);
    } on PlatformException catch (e) {}
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () {
          pickImage();
        },
        child: Container(
            decoration: BoxDecoration(
                image: DecorationImage(
                  image: FileImage(File(
                      "/data/user/0/com.example.live_snap/app_flutter/0.jpg")),
                  fit: BoxFit.cover,
                ),
                color: Colors.black87,
                borderRadius: BorderRadius.circular(5)),
            child: Align(
              alignment: FractionalOffset.bottomLeft,
              child: MaterialButton(
                  shape: const RoundedRectangleBorder(
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(5),
                      bottomRight: Radius.circular(5),
                    ),
                  ),
                  materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                  minWidth: double.infinity,
                  color: Colors.yellow,
                  onPressed: () {},
                  child: Text('SNAPPER')),
            )));
  }
}

Thank you so much!

use ListView.builder

final List<String> imageNames = <String>['apple', 'orange', 'banana'];

ListView.builder(
  itemCount: imageNames.length,
  itemBuilder: (BuildContext context, int index) {
    return   ImageContainer(imageName: imageNames[index]),
  }
);

/// and add parameter imageName to your ImageContainer()

class ImageContainer extends StatefulWidget {
  final String imageName
  const ImageContainer({Key? key, required imageName}) : super(key: key);

  @override
  State<ImageContainer> createState() => _ImageContainerState();
}

class _ImageContainerState extends State<ImageContainer> {
 
  /// access the imageName in here

  File? image;

  Future pickImage() async {
    try {
      final image = await ImagePicker().pickImage(source: ImageSource.gallery);

      if (image == null) return;

      final imageTemp = File(image.path);

      setState(() => this.image = imageTemp);
      final Directory extDir = await getApplicationDocumentsDirectory();
      String dirPath = extDir.path;
      const fileName = '0';
      final File localImage = await imageTemp.copy('$dirPath/$fileName.jpg');
      print(localImage);
    } on PlatformException catch (e) {}
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () {
          pickImage();
        },
        child: Container(
            decoration: BoxDecoration(
                image: DecorationImage(
                  image: FileImage(File(
                      "/data/user/0/com.example.live_snap/app_flutter/0.jpg")),
                  fit: BoxFit.cover,
                ),
                color: Colors.black87,
                borderRadius: BorderRadius.circular(5)),
            child: Align(
              alignment: FractionalOffset.bottomLeft,
              child: MaterialButton(
                  shape: const RoundedRectangleBorder(
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(5),
                      bottomRight: Radius.circular(5),
                    ),
                  ),
                  materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                  minWidth: double.infinity,
                  color: Colors.yellow,
                  onPressed: () {},
                  child: Text('SNAPPER')),
            )));
  }
}


I would post a comment but my reputation is not high enough..

It looks like you just need a id var in your stateful widget.

class ImageContainer extends StatefulWidget {
  final String id;
  const ImageContainer({Key? key, required this.id}) : super(key: key);

  @override
  State<ImageContainer> createState() => _ImageContainerState();
}

class _ImageContainerState extends State<ImageContainer> {
  File? image;

  Future pickImage() async {
    try {
      final image = await ImagePicker().pickImage(source: ImageSource.gallery);

      if (image == null) return;

      final imageTemp = File(image.path);

      setState(() => this.image = imageTemp);
      final Directory extDir = await getApplicationDocumentsDirectory();
      String dirPath = extDir.path;
      const fileName = '0';
      final File localImage = await imageTemp.copy('$dirPath/$fileName.jpg');
      print(localImage);
    } on PlatformException catch (e) {}
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () {
          pickImage();
        },
        child: Container(
            decoration: BoxDecoration(
                image: DecorationImage(
                  image: FileImage(File(
                      widget.id+".jpg")),
                  fit: BoxFit.cover,
                ),
                color: Colors.black87,
                borderRadius: BorderRadius.circular(5)),
            child: Align(
              alignment: FractionalOffset.bottomLeft,
              child: MaterialButton(
                  shape: const RoundedRectangleBorder(
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(5),
                      bottomRight: Radius.circular(5),
                    ),
                  ),
                  materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                  minWidth: double.infinity,
                  color: Colors.yellow,
                  onPressed: () {},
                  child: Text('SNAPPER')),
            )));
  }
}

Then you can do

 children: 
const [
      ImageContainer(id:"/data/user/0/com.example.live_snap/app_flutter/0"),
],

Let me know if I did not understand your question correctly!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM