【问题标题】:Combining River pod providers结合 River pod 供应商
【发布时间】:2022-10-17 17:18:13
【问题描述】:

我正在尝试通过组合两个提供程序来创建一个简单的 Riverpod 计数器应用程序,如果一个提供程序的计数发生变化,结果将乘以另一个提供程序的值,但是当我以这种方式接近它时出现编译时错误我已经在我的代码中显示了。我对 Riverpod 完全陌生,我使用的是 Flutter Riverpod 2.0.2 版。

我的代码:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final _myCount = StateNotifierProvider((ref) => ItemProvider());
final _myPrice = StateProvider((ref) => 200);

final _priceManager = StateProvider(
  (ref) {
    final myCountProvider = ref.watch(_myCount);
    final myPriceProvider = ref.watch(_myPrice);

   // error
    return (myCountProvider * myPriceProvider);
  },
);

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('RIVERPOD'),
        centerTitle: true,
      ),
      body: Consumer(builder: (context, ref, child) {
        final newCount = ref.watch(_myCount);
        final itemChange = ref.read(_myCount.notifier);
        final multiprovider = ref.watch(_priceManager);
        return Column(
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text("ITEMS: "),
                IconButton(
                    onPressed: () {
                      itemChange.decreament();
                    },
                    icon: const Icon(
                      Icons.arrow_back_ios,
                      size: 12.0,
                    )),
                Text('$newCount'),
                IconButton(
                    onPressed: () {
                      itemChange.increament();
                    },
                    icon: const Icon(
                      Icons.arrow_forward_ios,
                      size: 12.0,
                    )),
              ],
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text("PRICE: "),
                Text("$multiprovider"),
              ],
            )
          ],
        );
      }),
    );
  }
}

class ItemProvider<int> extends StateNotifier {
  ItemProvider() : super(1);

  void increament() {
    state++;
  }

  void decreament() {
    if (state != 1) {
      state--;
    }
  }
}

【问题讨论】:

  • 什么是编译器错误?
  • 不能无条件调用运算符“*”,因为接收者可以为“null”。尝试向目标添加空检查('!')。当我尝试使用上述源代码中的此代码( return (myCountProvider * myPriceProvider); )时出现
  • 将 <int> 类型添加到您的整数提供程序。

标签: flutter riverpod flutter-riverpod


【解决方案1】:

您的代码大部分都很好,但是您忘记在一堆地方指定泛型类型:

- final _myCount = StateNotifierProvider((ref) => ItemProvider());
+ final _myCount = StateNotifierProvider<ItemProvider, int>((ref) => ItemProvider());
- class ItemProvider<int> extends StateNotifier {
+ class ItemProvider extends StateNotifier<int> {

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2013-08-31
    • 2017-04-27
    相关资源
    最近更新 更多