Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 颤振应用程序在notifyListeners之后冻结_Flutter_Dart_Bloc - Fatal编程技术网

Flutter 颤振应用程序在notifyListeners之后冻结

Flutter 颤振应用程序在notifyListeners之后冻结,flutter,dart,bloc,Flutter,Dart,Bloc,我正在尝试使用谷歌地图插件编写一个简单的颤振应用程序。我需要使用多个BLoC/ChangeNotifier对象来管理屏幕上显示的对象 当我在ChangeNotifier上调用notifyListeners()时,问题就出现了。调用notifyListeners()的方法完成其执行,然后应用程序完全冻结(没有小部件更新,无法与现有小部件交互) 我试图理解问题出在哪里:我唯一理解的是,当companyesdata(引起问题的变更通知程序)为空时,它工作正常 class CompaniesData e

我正在尝试使用谷歌地图插件编写一个简单的颤振应用程序。我需要使用多个BLoC/ChangeNotifier对象来管理屏幕上显示的对象

当我在ChangeNotifier上调用
notifyListeners()
时,问题就出现了。调用
notifyListeners()
的方法完成其执行,然后应用程序完全冻结(没有小部件更新,无法与现有小部件交互)

我试图理解问题出在哪里:我唯一理解的是,当
companyesdata
(引起问题的变更通知程序)为空时,它工作正常

class CompaniesData extends ChangeNotifier {
  Map<MarkerId, Company> _companiesMap;

  set companies(Set<Company> companies) {
    _companiesMap = companies != null
        ? Map.fromIterable(
            companies,
            key: (company) => MarkerId(company.id.toString()),
            value: (company) => company,
          )
        : null;
    notifyListeners();
    ;
  }

  bool get available => _companiesMap != null;

  Company companyWithId(MarkerId id) => available ? _companiesMap[id] : null;

  Map<MarkerId, Company> get companiesIfAvailable =>
      available ? _companiesMap : Map();

  Iterable<Company> companiesFromIds(BuildContext context, Set<int> ids) {
    Set<int> idsCopy = Set.from(ids);
    return companiesIfAvailable.entries
        .where((entry) => idsCopy.remove(entry.value.id))
        .map<Company>((entry) => entry.value);
  }
}
/。。。
孩子:未来建设者(
未来:_companiesData.future,
生成器:(上下文,快照){
//根本不调用此生成器函数
//当完成者&u companiesData完成时
if(snapshot.connectionState==connectionState.done){
返回Provider.value(
值:snapshot.data,
孩子:/。。。
}否则{
返回中心(子项:CircularProgressIndicator());
}
}),
// ...

删除ChangeNotifier并不能解决此问题。

我发布错误以供将来参考。我在一个类中执行此操作:

static Stream<Obj1> stream() async* {
    while (true) {
      yield Obj1();
    }
  }

_subscription = Obj1.stream().listen((event) {
   // do something...
}
static Stream()异步*{
while(true){
屈服Obj1();
}
}
_订阅=Obj1.stream().listen((事件){
//做点什么。。。
}

由于流可能包含无限多的对象,因此对该流的订阅阻塞了主(并且仅限于此)线程。

出于好奇,你为什么使用
听:false
来获取公司数据?当我也使用
消费者时,是否有理由将其设置为
true
?编辑:to
true
啊,事实上,我刚刚意识到你也使用了消费者(奇怪的想法,顺便说一句,你不需要两者都使用)
notifyListener
是否正确完成,或者应用程序是否卡在那里?我读到
listen:true
调用
setState
当某些内容更改时,我认为它与
无状态小部件不兼容
@override
  void initState() {
    _fetchCompanies();
    super.initState();
  }

  void _fetchCompanies() {
    findUser().then((location) {
      Set<Company> companies = Set.from([Company.fake()]);
      // CompaniesData.companies is a setter, which calls
      // notifyListeners
      _companiesData.companies = companies;
    });
  }
final Completer<Map<MarkerId, Company>> _companiesData = Completer();

_AeroMainViewState() {
    findUser()
        .then(_fetchCompanies)
        .then((companies) => _companiesData.complete(Map.fromIterable(
              companies,
              key: (company) => MarkerId(company.id.toString()),
              value: (company) => company,
            )));
  }

  Future<Set<Company>> _fetchCompanies(LatLng location) async =>
      Set.from([Company.fake()]);
// ...
child: FutureBuilder<Map<MarkerId, Company>>(
          future: _companiesData.future,
          builder: (context, snapshot) {
            // this builder function isn't called at all
            // when the Completer _companiesData is completed
            if (snapshot.connectionState == ConnectionState.done) {
              return Provider<Map<MarkerId, Company>>.value(
                  value: snapshot.data,
                  child: // ...
            } else {
              return Center(child: CircularProgressIndicator());
            }
          }),
// ...
static Stream<Obj1> stream() async* {
    while (true) {
      yield Obj1();
    }
  }

_subscription = Obj1.stream().listen((event) {
   // do something...
}