【问题标题】:Riverpod Consumer Widget - How to watch from a dropdown widgetRiverpod Consumer 小部件 - 如何从下拉小部件中观看
【发布时间】:2021-08-02 00:48:02
【问题描述】:

尝试使用riverpod,没有找到答案 - 在线示例使用相同的 dart 文件。

我想传递在位于不同文件的下拉列表中选择的公司名称。 这里的代码应该是什么:

DropdownButton<String>(
          items: CompanyList.map((value) {
            return DropdownMenuItem<String>(
              child: Text(
                value,
                style: TextStyle(color: lightGrey),
              ),
              value: value,
            );
          }).toList(),
          value: company,
          onChanged: (value) {
            setState(() {
              company= value; // service 
            });
            ** final compamyProvider = Provider((_) => value); **
          },
        ),

所以我可以在这里获取值:

class SiteLayout extends ConsumerWidget {
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final String companyName = ref.watch(compamyProvider);
    return Scaffold(
...

【问题讨论】:

    标签: flutter consumer riverpod


    【解决方案1】:

    创建一个StateProvider

    final dropItemProvider = StateProvider&lt;String&gt;((ref) =&gt; "");

    完整代码:

    
    class MainWidgetR extends StatefulWidget {
      @override
      _MainWidgetState createState() => _MainWidgetState();
    }
    
    class _MainWidgetState extends State<MainWidgetR> {
      String value = "Company 0";
    
      final items = List.generate(
        4,
        (index) => DropdownMenuItem(
          child: Text("Company $index"),
          value: "Company $index",
        ),
      );
    
      @override
      void initState() {
        super.initState();
    
        ///setting default value  on provider
        WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
          context.read(dropItemProvider).state = items[0].value!;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                DropdownButton(
                  items: items,
                  value: value,
                  onChanged: (value) {
                    context.read(dropItemProvider).state = value as String;
                    setState(() {
                      value = value;
                    });
                  },
                ),
                RiverPodRespone(),
              ],
            ),
          ),
        );
      }
    }
    
    class RiverPodRespone extends ConsumerWidget {
      const RiverPodRespone({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context, watch) {
        final dataNotifier = watch(dropItemProvider);
        return Container(
          child: Text("${dataNotifier.state}"),
        );
      }
    }
    
    

    有帮助吗?

    【讨论】:

    • 在 1.0.0 中是否将 WidgetRef 替换为 ScopedReader
    猜你喜欢
    • 2015-12-12
    • 2023-02-14
    • 2021-02-02
    • 1970-01-01
    • 2011-03-06
    • 2020-12-22
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多