Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 以前调用过inheritFromWidgetOfExactType(InheritedProvider<;ConnectivityStatus>;)或inheritFromElement()_Flutter_Dart - Fatal编程技术网

Flutter 以前调用过inheritFromWidgetOfExactType(InheritedProvider<;ConnectivityStatus>;)或inheritFromElement()

Flutter 以前调用过inheritFromWidgetOfExactType(InheritedProvider<;ConnectivityStatus>;)或inheritFromElement(),flutter,dart,Flutter,Dart,在这个简单的类中,我想使用基态类来管理一些操作,例如访问internet连接: abstract class BaseState<T extends StatefulWidget> extends State { bool isOnline; ConnectivityStatus _connectivityStatus; @override void initState() { super.initState(); _connectivityStat

在这个简单的类中,我想使用基态类来管理一些操作,例如访问internet连接:

abstract class BaseState<T extends StatefulWidget> extends State {
  bool isOnline;
  ConnectivityStatus _connectivityStatus;

  @override
  void initState() {
    super.initState();
    _connectivityStatus = Provider.of<ConnectivityStatus>(context);
    isOnline = _connectivityStatus == ConnectivityStatus.Connected;
    if (!isOnline) {
      showSimpleNotification(Text("disconnected"), background: Colors.green);
    } else {
      showSimpleNotification(Text("connected"), background: Colors.red);
    }
  }
}
抽象类基态扩展状态{
布尔等值线;
连接状态(ConnectivityStatus);;
@凌驾
void initState(){
super.initState();
_connectivityStatus=Provider.of(上下文);
isOnline=_connectivityStatus==connectivityStatus.Connected;
如果(!isOnline){
showSimpleNotification(文本(“断开”),背景:颜色。绿色);
}否则{
showSimpleNotification(文本(“已连接”),背景:颜色。红色);
}
}
}
当我尝试使用该类时,如:

class _FragmentLoginState extends BaseState<FragmentLogin> with SingleTickerProviderStateMixin {
  PageController _pageController;
  Color left = Colors.black;
  Color right = Colors.white;

  @override
  void initState() {
    super.initState();
    _pageController = PageController(initialPage: 1);
  }

  @override
  Widget build(BuildContext context) {
  }
}
class\u FragmentLoginState使用SingleTickerProviderStateMixin扩展BaseState{
页面控制器_页面控制器;
左侧颜色=Colors.black;
Color right=Colors.white;
@凌驾
void initState(){
super.initState();
_pageController=pageController(初始页:1);
}
@凌驾
小部件构建(构建上下文){
}
}

问题是您还没有有效的上下文

你可以试试这两种解决办法

  • 延迟使用上下文:
@覆盖
void initState(){
super.initState();
_initConnectivity();
}
Future _initConnectivity()异步{
等待未来。延迟AD(持续时间为零);
_connectivityStatus=Provider.of(上下文);
isOnline=_connectivityStatus==connectivityStatus.Connected;
如果(!isOnline){
showSimpleNotification(文本(“断开”),背景:颜色。绿色);
}否则{
showSimpleNotification(文本(“已连接”),背景:颜色。红色);
}
}
  • 在构建函数中移动逻辑(在BaseState中)

_initConnectivity(){
_connectivityStatus=Provider.of(上下文);
isOnline=_connectivityStatus==connectivityStatus.Connected;
如果(!isOnline){
showSimpleNotification(文本(“断开”),背景:颜色。绿色);
}否则{
showSimpleNotification(文本(“已连接”),背景:颜色。红色);
}
}
@凌驾
小部件构建(构建上下文){
_initConnectivity();
}
在第二种方法中,您还可以创建一个类似于
isFirstBuild
的标志,以确保它只运行一次

这些也可能有助于:

将执行延迟到下一帧(即initState完成后)

@覆盖
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback(())异步{
_connectivityStatus=Provider.of(上下文);
isOnline=_connectivityStatus==connectivityStatus.Connected;
如果(!isOnline){
showSimpleNotification(文本(“断开”),背景:颜色。绿色);
}否则{
showSimpleNotification(文本(“已连接”),背景:颜色。红色);
}
});
}
@override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      _connectivityStatus = Provider.of<ConnectivityStatus>(context);
      isOnline = _connectivityStatus == ConnectivityStatus.Connected;
      if (!isOnline) {
        showSimpleNotification(Text("disconnected"), background: Colors.green);
      } else {
        showSimpleNotification(Text("connected"), background: Colors.red);
      }
    });
  }