首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter :这个成员'state‘只能在'package:state_notifier/state_notifier.dart’的子类的实例成员中使用。

Flutter :这个成员'state‘只能在'package:state_notifier/state_notifier.dart’的子类的实例成员中使用。
EN

Stack Overflow用户
提问于 2020-07-16 12:04:55
回答 2查看 2.1K关注 0票数 4

我有一个关于切换小部件的简单例子,我的期望在单击按钮后显示circularProgressIndicator,然后在3秒后显示文本。对于我的例子,我使用钩子钩子

LoadingProvider

代码语言:javascript
复制
class IsLoading extends StateNotifier<bool> {
  IsLoading() : super(false);
  void toggleLoading(bool value) => state = value;
}

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

Main.dart

代码语言:javascript
复制
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'.

我漏掉了什么?

下面的文档说明了我的源代码:

EN

回答 2

Stack Overflow用户

发布于 2020-07-16 13:48:08

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

所以用读方法代替isLoading.toggleLoading(真)调用,这样它就可以重新构建isLoading.read(上下文).toggleLoading(真)这样的状态。

票数 1
EN

Stack Overflow用户

发布于 2022-01-09 16:22:30

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

代码语言:javascript
复制
class IsLoading extends StateNotifier<bool> {
  IsLoading() : super(false);
  void toggleLoading(bool value) => state = value;
}

final isLoadingProvider =
    StateNotifierProvider<IsLoading, bool>((ref) => IsLoading());

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

代码语言:javascript
复制
final isLoading = ref.watch(isLoadingProvider);
return Scaffold(body: Center(child:
isLoading ? CircularProgressIndicator() : Text('This Is Your Data'),))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62934278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档