Flutter FutureBuilder ожидает возвращаемого значения - PullRequest
0 голосов
/ 18 июня 2020

У меня есть код ниже, и он дает мне предупреждение, как показано ниже, и во время выполнения он говорит, что функция сборки вернула значение null.

Эта функция имеет тип возврата 'Widget ', но не заканчивается оператором возврата. Попробуйте добавить оператор возврата или изменить тип возврата на void.

UPDATE: что не так в приведенном ниже коде.?.

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart';

import 'package:permission_handler/permission_handler.dart';

List<FileSystemEntity> _pdf = [];

class BrowserScaffold extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return TabsApp();
  }
}

Future<List> loadfiles() async {
  _pdf = [];
  int filecount = 0;
  var status = await Permission.storage.status;
  if (status.isUndetermined) {
    await [
      Permission.storage,
    ].request();
  }
  Directory dir = Directory('/storage/emulated/0/');
  String pdfpath = dir.toString();
  print('PATH IS ' + pdfpath);
  List<FileSystemEntity> _files;
  _files = dir.listSync(recursive: true, followLinks: false);
  for (FileSystemEntity entity in _files) {
    String path = entity.path;
    if (path.endsWith('.pdf')) _pdf.add(entity);
  }

  for (var i = 0; i < _pdf.length; i++) {
    //print(_pdf[i]);
  }
  filecount = _pdf.length;
  print('#############ENTERED');
  print(filecount);
  return _pdf;
}

class TabsApp extends State<BrowserScaffold> {


  @override
  Widget build(BuildContext context) {
    return Container(
      child: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: AppBar(
            title: Text('MY Files'),
            bottom: TabBar(tabs: [
              Tab(text: 'ALL FILES'),
              Tab(text: 'RECENT FILES'),
            ]),
          ),
          body: TabBarView(
            children: [
              RaisedButton(
                child: Text('LIST FILES'),
                onPressed: () => loadfiles(),
              ),
              FutureBuilder(
                  future: loadfiles(),
                  builder: (context, AsyncSnapshot snapshot) {
                    if (snapshot.hasData) {
                      print('OKOK##################################');
                      if (snapshot.data != null) {
                        return ListView.builder(
                            itemCount: snapshot.data.length,
                            itemBuilder: (context, index) {
                              return Container(
                                  child: Card(
                                child: Text(
                                  basename(snapshot.data[index].path),
                                  style: TextStyle(
                                      fontWeight: FontWeight.bold,
                                      fontSize: 18),
                                ),
                              ));
                              //return Text(snapshot.data[index].path);
                            });
                      } else {
                        print('FAIL##################################');
                        return new CircularProgressIndicator();

                      }
                    } else {
                      print('FAIL2##################################');
                      return Text("Empty");
                    }
                  }),
            ],
          ),
        ),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 18 июня 2020

Эта функция имеет тип возврата «Виджет», но не заканчивается оператором возврата. Попробуйте добавить оператор возврата или изменить тип возвращаемого значения на void.

В предупреждении вам все сказано. У вас есть два if, поэтому вам также нужно иметь два else.

if (snapshot.hasData) {
  if (snapshot.data != null) {
    ...
 }else{
    return Text("It is null");
  }
}else{
  return Text("Empty");
}
...