【问题标题】:Delete specific widget | Flutter & Riverpod删除特定小部件 |颤振和Riverpod
【发布时间】:2020-12-13 18:55:38
【问题描述】:

如图所示,我正在尝试创建一个骰子列表,我可以在其中添加或删除骰子。我尝试过 StateProvider、ChangeNotifier 和 StateNotifier。每一个似乎都没有像我期望的那样工作。我正在尝试创建一个包含 dieWidgets 列表的提供程序,但是当我长按它时,我无法弄清楚如何删除特定的 die。图像显示了一个删除它的弹出菜单,这是长期目标,但现在只需长按删除就可以了。关于如何解决这个问题的想法?

Code

ma​​in.dart

class DiceNotifier extends ChangeNotifier {
  List<DieWidget> dice = [];

  void add() {
    dice.add(DieWidget());
    notifyListeners();
  }

  void removeDie(int id) {
    // FIXME: Unable to delete a die based on id
    print(id);
    notifyListeners();
  }
}

final diceProvider = ChangeNotifierProvider((_) {
  return DiceNotifier();
});

class MyHomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final dice = watch(diceProvider).dice;
    return Scaffold(
      appBar: AppBar(
        title: Text("Dice"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ...dice,
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read(diceProvider).add();
        },
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

die_widget.dart

class DieWidget extends StatefulWidget {
  @override
  _DieWidgetState createState() => _DieWidgetState();
}

class _DieWidgetState extends State<DieWidget> {
  int value = 0;
  int id = 0;
  @override
  Widget build(BuildContext context) {
    return FlatButton(
      child: Text(
        '$value',
      ),
      onPressed: () {
        setState(() {
          value++;
          id++;
        });
        // context.read(dieProvider).increment();
      },
      onLongPress: () {
        final dice = context.read(diceProvider);
        dice.removeDie(id);
        // print(this.value);
      },
    );
  }
}

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    一种解决方案是在DiceWidget 类中定义一个参数value

    class DiceWidget extends StatefulWidget {
      const DiceWidget({ Key key, this.value }) : super(key: key);
      int value;
      @override
      _DiceWidgetState createState() => _DiceWidgetState();
    
    }
    

    并从DiceWidget 访问这些数据:

    class DiceWidget extends StatefulWidget {
      @override
      _DiceWidgetState createState() => _DiceWidgetState();
    }
    
    class _DiceWidgetState extends State<DiceWidget> {
      @override
      Widget build(BuildContext context) {
        return FlatButton(
          child: Text(
            widget.value.toString() ?? '',
          ),
          onLongPress: () {
            final dice = context.read(diceProvider);
            dice.removeDice(widget.value);
            // print(widget.value);
          },
        );
      }
    }
    

    DiceNotifier 类中,我建议将dices 数组实现为List&lt;int&gt;

    List<int> dices = [];
    

    因此,addDice()removeDice() 函数将分别为:

    class DiceNotifier extends ChangeNotifier {
      List<int> dices = [];
    
      void addDice() {
        dices.add(dices.length);
        notifyListeners();
      }
    
      void removeDice(int id) {
        dices.remove(id);
        print(id);
        notifyListeners();
      }
    }
    

    为了使示例正常工作,我们还需要修改MyHomePage Column children,以构建DiceWidgets 的列表:

    ...dices.map((d) => DiceWidget(value: d)).toList(),
    

    整个示例将是: main.dart:

    class DiceNotifier extends ChangeNotifier {
      List<int> dices = [];
    
      void addDice() {
        dices.add(dices.length);
        notifyListeners();
      }
    
      void removeDice(int id) {
        dices.remove(id);
        print(id);
        notifyListeners();
      }
    }
    
    final diceProvider = ChangeNotifierProvider((_) {
      return DiceNotifier();
    });
    
    class MyHomePage extends ConsumerWidget {
      @override
      Widget build(BuildContext context, ScopedReader watch) {
        final dices = watch(diceProvider).dices;
        return Scaffold(
          appBar: AppBar(
            title: Text("Dice"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                ...dices.map((d) => DiceWidget(value: d)).toList(),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              context.read(diceProvider).addDice();
            },
            child: Icon(Icons.add),
          ), 
        );
      }
    }
    

    dice_widget.dart:

    class DiceWidget extends StatefulWidget {
      @override
      _DiceWidgetState createState() => _DiceWidgetState();
    }
    
    class _DiceWidgetState extends State<DiceWidget> {
      @override
      Widget build(BuildContext context) {
        return FlatButton(
          child: Text(
            widget.value.toString() ?? '',
          ),
          onLongPress: () {
            final dice = context.read(diceProvider);
            dice.removeDice(widget.value);
            print(widget.value);
          },
        );
      }
    }
    

    【讨论】:

    • 这太棒了!非常感谢您的时间和帮助。我需要再坐一会儿,仔细研究一下这一切的逻辑。再次,谢谢你:)
    猜你喜欢
    • 2019-05-05
    • 2020-05-18
    • 2020-09-07
    • 2020-11-16
    • 2021-08-19
    • 2021-06-03
    • 2018-09-13
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多