代码之家  ›  专栏  ›  技术社区  ›  Randomize

带有提供者通知的表单内的Flutter复选框不起作用

  •  0
  • Randomize  · 技术社区  · 2 年前

    我有一个以表单形式呈现的复选框(未定义为 FormField 因为它不存在于Flutter的本地版本,并且试图扩展它无论如何都不起作用):

    import 'package:flutter/material.dart';
    import 'checkbox_form_field.dart';
    import 'package:sellertools/providers/money.dart';
    import 'package:provider/provider.dart';
    
    
    class MoneyFormCheckbox<T extends Money> extends StatelessWidget {
      final String label;
    
      const MoneyFormCheckbox(this.label, {Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        final initValue = context.read<T>().money == 1;
        return Padding(
            padding: const EdgeInsets.symmetric(vertical: 10),
            child : Row(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Expanded(
                  child:
                      Checkbox(
                       value: initValue,
                       onChanged: (value) => context.read<T>().set(value! ? 1 : 0),
                      )
                )])
        );
      }
    
    }
    

    其中 Money 类是:

    import 'package:flutter/foundation.dart';
    
    class Money with ChangeNotifier {
      double _money = 0;
    
      double get money => _money;
    
      void set(double money) {
        _money = money;
        notifyListeners();
      }
    }
    

    这里的问题是,当我按下复选框时,什么都不会发生,而且它一直处于未选中状态。同样的行为也适用于 TextFormField 类。知道如何使复选框也能使用吗 Provider 表单中的模式?

    1 回复  |  直到 2 年前
        1
  •  0
  •   manhtuan21    2 年前

    您应该将read更改为watch以订阅提供商:

    final initValue = context.read<T>().money == 1;
    

    final initValue = context.watch<T>().money == 1;
    
    推荐文章