Флаттер устанавливает несколько потоков в классе InheritedWidget - PullRequest
0 голосов
/ 03 мая 2020

У меня есть InheritedWidget, обернутый в MaterialApp (root виджет).

// common.dart
import 'dart:async';
import 'package:flutter/widgets.dart';

class GlobalValues extends InheritedWidget {
  StreamController controller;

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;

  GlobalValues({Key key, Widget child}) : super(key: key, child: child);

  static GlobalValues of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<GlobalValues>();
  }

  getFriends(AsyncSnapshot snapshot, BuildContext context) {
    if (snapshot?.data == null) {
      return [];
    } else if (snapshot.data.containsKey('frindsList')) {
      return snapshot.data['frindsList'];
    }
  }

  getSocket(AsyncSnapshot snapshot, BuildContext context) {
    if (snapshot?.data == null) {
      return [];
    } else if (snapshot.data.containsKey('connectedSocket')) {
      return snapshot.data['connectedSocket'];
    }
  }
}

Теперь я добавляю поток в виджет A

socket.on('connect',(_){
        ctrl.sink.add({"connectedSocket":socket});
 });

В Widget AI есть еще один сценарий, в котором я добавляю другой поток

buttonPress(){
    ctrl.sink.add({"frindsList":friends});
}

в Widget BI Я слушаю

 Widget build(BuildContext context) {

    return StreamBuilder(
      stream: GlobalValues.of(context).controller.stream,
      builder: (context, snapshot){
            friends=GlobalValues.of(context).getFriends(snapshot, context);        
            return ListView.builder(
              itemCount: friends.length,
              itemBuilder:(context,i){
                return buildFriendList(friends[i]); 
              }); 

    });
  }

в Widget C Я слушаю

StreamBuilder(
        stream: GlobalValues.of(context).controller.stream,
        builder: (context, snapshot){
          var mySocket = GlobalValues.of(context).getSocket(snapshot, context);
          return Text(mySocket.toString());        
        }

        )  

Но в c я всегда получаю ноль. Я новичок в флаттер и дартс. Похоже, что добавление нескольких потоков и их прослушивание - сложная задача. Кто-нибудь может мне помочь, пожалуйста?

...