成员 'setState' 只能在 'package:flutter/src/widgets/framework.dart' 的子类的实例成员中使用

Posted

技术标签:

【中文标题】成员 \'setState\' 只能在 \'package:flutter/src/widgets/framework.dart\' 的子类的实例成员中使用【英文标题】:The member 'setState' can only be used within instance members of subclasses of 'package:flutter/src/widgets/framework.dart'成员 'setState' 只能在 'package:flutter/src/widgets/framework.dart' 的子类的实例成员中使用 【发布时间】:2019-11-02 07:18:33 【问题描述】:

(i18n) 我使用 MyApp 类之外的 setState 来更改语言,我收到此警告,但不知道如何解决。

info: The member 'setState' can only be used within instance members of subclasses of 'package:flutter/src/widgets/framework.dart'. (invalid_use_of_protected_member at [flutter_firebase_authen] lib\app.dart:22)
class MyApp extends StatefulWidget 
  final FirebaseAnalyticsObserver observer;

  const MyApp(
    Key key,
    @required this.observer,
  ) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();

  static void setLocale(BuildContext context, Locale newLocale) 
    final _MyAppState state = context.ancestorStateOfType(const TypeMatcher<_MyAppState>());
    state.setState(() 
      state.locale = newLocale;
    );
  

【问题讨论】:

尝试:不要使用static和final。 【参考方案1】:

警告信息很清楚:函数setState 只能从类中调用,不能从其他类中调用。

解决方法很简单,在 State 类中编写一个帮助函数,为您调用 setState。例如:

refresh() => setState(() );

现在你可以在这个班级之外拨打state.refresh()

(但实际上,如果您从另一个班级调用setState,也许您应该查看ValueNotifier,或StreamBuilder等)

【讨论】:

以上是关于成员 'setState' 只能在 'package:flutter/src/widgets/framework.dart' 的子类的实例成员中使用的主要内容,如果未能解决你的问题,请参考以下文章

React - setState(...): 只能更新一个挂载或挂载的组件

“警告:setState(...):只能更新已安装或已安装的组件”是啥意思?

React 警告:setState(...) 只能更新已安装或正在安装的组件

从无状态小部件调用有状态小部件的 setState

React setstate 只能更新挂载或挂载的组件——在重新渲染时

listview 不使用 setState 更新