【问题标题】:Flutter Riverpod : The member 'state' can only be used within instance members of subclasses of 'package:state_notifier/state_notifier.dart'Flutter Riverpod:成员“state”只能在“package:state_notifier/state_notifier.dart”的子类的实例成员中使用
【发布时间】:2020-07-16 12:04:55
【问题描述】:

我有一个关于切换小部件的简单示例,我期望在单击按钮后显示圆形进度指示器,然后在 3 秒后显示文本。对于我的示例,我使用 riverpod_hooksflutter_hooks

加载提供者

class IsLoading extends StateNotifier<bool> {
  IsLoading() : super(false);
  void toggleLoading(bool value) => state = value;
}

final isLoadingProvider = StateNotifierProvider((ref) => IsLoading());

Main.dart

class TestingApp extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final IsLoading isLoading = useProvider(isLoadingProvider);
    return Scaffold(
      body: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Center(
              child: isLoading.state ? CircularProgressIndicator() : Text('This Is Your Data'),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FlatButton(
                  onPressed: () => showLoading(isLoading), child: Text('Toggle Loading')),
            ),
          ],
        ),
      ),
    );
  }

  void showLoading(IsLoading isLoading) async {
    isLoading.toggleLoading(true);
    print("Proses");
    await Future.delayed(const Duration(seconds: 3));
    print("Done");
    isLoading.toggleLoading(false);
  }
}

但是当我按下按钮时,它没有显示 progressIndicator 并且仍然显示文本,我收到了这个警告:
The member 'state' can only be used within instance members of subclasses of 'package:state_notifier/state_notifier.dart'.

我错过了什么?

我的源代码遵循这样的文档:

【问题讨论】:

    标签: flutter riverpod


    【解决方案1】:

    它在那里说当你像那样调用增量时它不会触发重建方法。

    所以而不是 isLoading.toggleLoading(true) 用 read 方法调用,这样它就可以像这样重建状态 isLoading.read(context).toggleLoading(true)

    【讨论】:

      【解决方案2】:

      为您的StateNotifierProvider 提供两种类型,您要返回的类的类型和该类的状态。

      class IsLoading extends StateNotifier<bool> {
        IsLoading() : super(false);
        void toggleLoading(bool value) => state = value;
      }
      
      final isLoadingProvider =
          StateNotifierProvider<IsLoading, bool>((ref) => IsLoading());
      

      在您的build 方法(ConsumerStateWidget)中使用:

      final isLoading = ref.watch(isLoadingProvider);
      return Scaffold(body: Center(child:
      isLoading ? CircularProgressIndicator() : Text('This Is Your Data'),))
      

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2017-06-06
        • 2015-11-27
        • 2023-03-27
        相关资源
        最近更新 更多