Функция Flutter Build никогда не должна быть нулевой - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь вернуть виджет, в котором он возвращает контейнер с текстом «Не удается найти устройство», если он не находит указанное c устройство, и если он его находит, в тексте должно быть указано «Устройство нашел!'. Я новичок в флаттере и попытался поиграть с пакетом Flutter Blue, чтобы получить грань asp фреймворка во время работы над проектом. Это мой исходный код:

 Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Find Devices'),
      ),
      body: RefreshIndicator(
        onRefresh: () =>
            FlutterBlue.instance.startScan(timeout: Duration(seconds: 4)),
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              StreamBuilder<List<ScanResult>>(
                  stream: FlutterBlue.instance.scanResults,
                  initialData: [],
                  builder: (c, snapshot) {
                    child:
                    snapshot.data.map((r) => () {
                          if (r.device.id.toString() == '30:AE:A4:1A:B1:4E') {
                            return Container(
                              child: Text('Device found!'),
                            );
                          } else {
                            return Container(
                              child: Text('Cannot find device'),
                            );
                          }
                        }); //endof map
                  }),
            ],
          ),
        ),
      ),
      floatingActionButton: StreamBuilder<bool>(
        stream: FlutterBlue.instance.isScanning,
        initialData: false,
        builder: (c, snapshot) {
          if (snapshot.data) {
            return FloatingActionButton(
              child: Icon(Icons.stop),
              onPressed: () => FlutterBlue.instance.stopScan(),
              backgroundColor: Colors.red,
            );
          } else {
            return FloatingActionButton(
                child: Icon(Icons.search),
                onPressed: () => FlutterBlue.instance
                    .startScan(timeout: Duration(seconds: 4)));
          }
        },
      ),
    );
  }

Тем временем я пытался создать виджет, но не уверен, правильно ли я сделал это, потому что у меня все еще та же ошибка.

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Find Devices'),
      ),
      body: RefreshIndicator(
        onRefresh: () =>
            FlutterBlue.instance.startScan(timeout: Duration(seconds: 4)),
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              StreamBuilder<List<ScanResult>>(
                  stream: FlutterBlue.instance.scanResults,
                  initialData: [],
                  builder: (c, snapshot) {
                    child:
                    snapshot.data.map((r) => () {
                          return _buildResult(r);
                        }); //endof map
                  }),
            ],
          ),
        ),
      ),
      floatingActionButton: StreamBuilder<bool>(
        stream: FlutterBlue.instance.isScanning,
        initialData: false,
        builder: (c, snapshot) {
          if (snapshot.data) {
            return FloatingActionButton(
              child: Icon(Icons.stop),
              onPressed: () => FlutterBlue.instance.stopScan(),
              backgroundColor: Colors.red,
            );
          } else {
            return FloatingActionButton(
                child: Icon(Icons.search),
                onPressed: () => FlutterBlue.instance
                    .startScan(timeout: Duration(seconds: 4)));
          }
        },
      ),
    );
  }

  _buildResult(result) {
    if (result.device.id.toString() == mydevice) {
      return Container(
        child: Text('Device found!'),
      );
    } else {
      return Container(
        child: Text('Cannot find device'),
      );
    }
  }

Ответы [ 2 ]

1 голос
/ 10 июля 2020

в функции построения вашего StreamBuilder , почему вы используете параметр child ?

builder: (c, snapshot) { child: snapshot.data.map((r) => () { return _buildResult(r); }); //endof map }),

Попробуйте это один раз

builder: (c, snapshot) { return snapshot.data.map((r) => () { return _buildResult(r); }); //endof map }),

Кроме того, поскольку вы используете метод .map (), возможно, будет возвращено более 1 виджета, поэтому, на мой взгляд, лучше использовать просмотр списка.

1 голос
/ 10 июля 2020

вы забыли возврат внутри Steam Builder

StreamBuilder<List<ScanResult>>(
   stream: FlutterBlue.instance.scanResults,
   initialData: [],
   builder: (c, snapshot) {
   //child: I don't know what this (child:) parameter is doing here, 
   //there is no child inside the builder
     if(snapshot.data.length > 0) //check if there is data to map,
                                  // initialData is an empty List so it won't map anything
       return snapshot.data.map((r) => () { //You forgot the return here
         return _buildResult(r);
       }); //endof map
     else return SizedBox();
}),
...