Home > front end >  Flutter - Dispose a variable
Flutter - Dispose a variable

Time:02-20

I have a page to create posts. I'm using image_picker package to get images and there's a provider that gets the images to the post creation page. There's a variable selectedImagesList that stores the list of picked images to be shown after they're picked by user.

class _AddPostViewState extends State<AddPostView> {
  TextEditingController postTextController = TextEditingController();
  PostNotifier postNotifier(bool renderUi) =>
      Provider.of<PostNotifier>(context, listen: renderUi);
  int activeImageIndex = 0;
  List<File>? selectedImagesList = [];

  @override
  void initState() {
    postTextController = TextEditingController();
    super.initState();
  }

  @override
  void dispose() {
    print("disposing stuff");
    selectedImagesList = [];
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    selectedImagesList = postNotifier(true).selectedPostImages;

    return GestureDetector(
      onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.white,
          title: const Text(
            "New Post",
            style: TextStyle(color: Colors.black),
          ),
          centerTitle: true,
        ),
        body: SingleChildScrollView(
          child: Column(children: [
            Column(
                Container(
                  child: TextField(
                    controller: postTextController,
                    decoration: const InputDecoration(
                        hintText: "Write something here..."),
                  ),
                ),
                const SizedBox(
                  height: 5,
                ),
                ElevatedButton(
                    onPressed: () {
                      postNotifier(false).pickPostImages();
                    },
                    child: selectedImagesList == null
                        ? const Text("Add Images")
                        : const Text("Reselect Images")),

                if (postNotifier(true).selectedPostImages != null) ...[
                  Container(
                    padding: const EdgeInsets.all(25.0),
                    height: 420,
                    width: 396,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        CarouselSlider.builder(
                            options: CarouselOptions(
                              onPageChanged: (index, reason) =>
                                  setState(() => activeImageIndex = index),
                            ),
                            itemCount: selectedImagesList!.length,
                            itemBuilder:
                                (BuildContext context, index, realIndex) {
                              final selectedImage = selectedImagesList?[index];
                              return buildImage(selectedImage!, index);
                            }),
                        const SizedBox(
                          height: 21,
                        ),
                        buildDotIndicator(),
                      ],
                    ),
                  ),
                ] else ...[
                  const SizedBox(
                    height: 0,
                  ),
                ],
              ],
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                    onPressed: () async {
                      final authenticationNotifier =
                          Provider.of<AuthenticationNotifier>(context,
                              listen: false);
                      var userEmail = await authenticationNotifier
                          .fetchUserEmail(context: context);
                      var postText = postTextController.text;
                      await postNotifier(false)
                          .uploadPostImageList(context: context);
                      var postMedia = postNotifier(false).uploadedImageUrlList;

                      if (postMedia != null) {
                        await postNotifier(false)
                            .addMultiImagePost(
                                context: context,
                                  //post dto
                                )
                            .whenComplete(
                          () {
                            SnackBarUtility.showSnackBar(
                                message: "Post added to database",
                                context: context);
                            postTextController.clear();
                            selectedImagesList = [];
                            Navigator.of(context).popAndPushNamed(HomeRoute);
                          },
                        );
                      } else {
                        SnackBarUtility.showSnackBar(
                            message: "Something went wrong", context: context);
                      }
                    },
                    child: const Text("Post")),
              ],
            )
          ]),
        ),
      ),
    );

I'm able to clear the postTextController by using .whenComplete() but the selectedImagesList still remains there and subsequent posts have images from previous posts.

As evident in above code I've tried to set selectedImagesList to empty at the void dispose() function as well but it's not working. How to dispose the images once post is uploaded

CodePudding user response:

You're not using selectedImagesList defined in the state, instead, you're using selectedImagesList defined in PostNotifier class. so inside dispose method you should clear selectedImagesList defined in PostNotifier class.

  • Related