How do I remove a widget in response to user input?

吃可爱长大的小学妹 提交于 2021-01-28 06:07:05

问题


I have a chip. How do I get the chip to disappear when the user has deleted it? I do not understand the code at all from Flutter Docs.

I've tried everything.

Chip(
 deleteIcon:  Icon(Icons.close, size: 15,),
 label: Text('Delete me!'),
 deleteButtonTooltipMessage: 'erase',
 onDeleted: () {setState(() {print("I want to erase this chip, and     eat chips");}); },
)

The docs suggest that this chip (Chip) can be erased. But they don't give much in the way of examples.


回答1:


I am assuming that you have this Chip in some kind of StatefulWidget.

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

  @override
  State createState() => _DisappearingChipState();
}

class _DisappearingChipState extends State<DisappearingChip> {
  bool erased;

  @override
  void initState() {
    erased = false;
    super.initState();
  }

  @override
  Widget build(BuildContext context) => erased
      ? Container()
      : Chip(
          deleteIcon: Icon(
            Icons.close,
            size: 15,
          ),
          label: const Text('Delete me!'),
          deleteButtonTooltipMessage: 'erase',
          onDeleted: () {
            setState(() {
              erased = true;
            });
          },
        );
}

Variable responding to state

As you can see, the State object holds a bool called erased that is assigned false when the state is initialized.
When the Chip is meant to be deleted now, this variable is updated and the widget rebuilds. As it responds to the value of erased, an empty Container is returned once the Chip is deleted.


I recommend this resource to learn more.




回答2:


you need to set a flag or a bool which indicates whether the Chip is deleted or not.

Working Example

import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isDeleted = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: _isDeleted
              ? Container()
              : Chip(
                  label: Text("EMINEM"),
                  onDeleted: () {
                    setState(() {
                      _isDeleted = true;
                    });
                  },
                ),
        ),
      ),
    );
  }
}

Output




回答3:


bool isDeleted = false; // Place the variable within the same class or declare them as global variables
//[...]
    (isDeleted)?Container():Chip(
     deleteIcon:  Icon(Icons.close, size: 15,),
     label: Text('Delete me!'),
     deleteButtonTooltipMessage: 'erase',
     onDeleted: () {setState(() {isDeleted=true;}); },
    )
//[...]

isDeleted is a boolean variable which stores either true or false.

If you see your main code (which you haven't provided as it wasn't needed) there is an build method which we override in order to implement/return a single Widget(UI).

The build method called whenever setstate is called or 60 times a second while playing a animation (60 fps).

So when we attempt to delete a Chip, the onDeleted method is triggered which in turn triggers setstate() function which first makes the required changes mentioned in the function we pass as a parameter and it then requests the app to call the build function again.

In our case, when our Widget is first built the app sees that the ternary condition's final result is false so it builds the second widget, i.e. the Chip widget. Now when setState is called the value of onDeleted changes to true and then the build function is called again. But this time since the value of onDeleted is true the first widget is built i.e a Container with no dimensions...equivalent to having nothing there(But we use it since we cannot leave it empty as it will lead to some error(s) depending on how you use the code).

Now you might wonder why don't we realize/notice anything while all this happens...

It's because an average human can notice any change only if that change takes more than 200 milliseconds to happen. If it is faster(takes lesser than 200ms) than that then we view those changes as an animation/transition. If those changes take more time to occur, then we feel that the app is lagging.

That is why keeping Stateful widgets separate increases the app's overall performance as we won't rebuild the widgets which don't need to get rebuilt as they'll remain Stateless.

I hope your doubts are now cleared.



来源:https://stackoverflow.com/questions/57715410/how-do-i-remove-a-widget-in-response-to-user-input

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!