Реализация Flutter BLo C с помощью streamBuilder - PullRequest
0 голосов
/ 08 апреля 2020

У меня проблема с моей реализацией BLo C, у меня был этот код в synchronize.dart

...

class _SynchronizeState extends State<Synchronize> {
  UserBloc userBloc;
  //final dbRef = FirebaseDatabase.instance.reference();

  @override
  Widget build(BuildContext context) {
    userBloc = BlocProvider.of(context);

    return Scaffold(
      resizeToAvoidBottomPadding: false,
      body: Container(
        ...
        ),
        child: StreamBuilder(
          stream: dbRef.child('info_tekax').limitToLast(10).onValue,
          builder: (context, snapshot) {
            if(snapshot.hasData && !snapshot.hasError){
              Map data = snapshot.data.snapshot.value;
              List keys = [];
              data.forEach( (index, data) => keys.add(index) );
              return ListView.builder(
                itemCount: data.length,
                itemBuilder: (context, index) => SynchronizeItem(title: keys[index], bottom: 10, onPressed: (){ print(keys[index]); })
              );
            }else{
              return Container(
                child: Center(
                  child: Text('Loading...'),
                ),
              );
            }

          }
        ),

      ),
    );
  }
}

Код prev ios, работает правильно, но я хочу реализовать blo c Шаблон, у меня есть userBlo c, тогда я хочу поставить это userBloc.getDevicesForSinchronized() вместо dbRef.child('info_tekax').limitToLast(10).onValue,

моя проблема заключается в следующем:

void getDevicesForSynchronized() {
  return dbRef.child(DEVICES).limitToLast(10).onValue;
}

я получаю эту ошибку ** Vaue типа «Поток» нельзя вернуть из метода «getDevicesForSynchronized», поскольку он имеет тип возврата «void»

Ошибка очень ясна, но я не знаю, какой тип мне нужно вернуть , попробуйте:

Furure<void> getDevicesForSynchronized() async {
  return await dbRef.child(DEVICES).limitToLast(10).onValue;    
}

или

Furure<void> getDevicesForSynchronized() async {
  dinamyc result = await dbRef.child(DEVICES).limitToLast(10).onValue;    
}

и другие решения, но я не знаю, как правильно вернуть значение для использования в StreamBuilder

1 Ответ

0 голосов
/ 08 апреля 2020

Из сообщения об ошибке видно, что тип возвращаемого значения - Stream. Измените свой метод как:

Future<Stream> getDevicesForSynchronized() async {
  return dbRef.child(DEVICES).limitToLast(10).onValue;    
}
...