Возвращение FutureBuilder передано в var Flutter - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно сохранить некоторые данные в файле ".txt" в переменной. Для этого я использую FutureBuilder. Идея состоит в том, чтобы обработать действие чтения (asyn c) с помощью FutureBuilder и передать FutureBuilder return моей глобальной переменной, которая будет обновляться при необходимости.

  Future<String> _read() async {
   try {
   final file = await _localBio;
   String body = await file.readAsString();
   // Read the file.
   return body;
   } catch (e) {
   // If encountering an error, return 0.
   return "Can't read";
 }
}

var bio ="";

String _ReadBio(){
FutureBuilder<String>(
  future: _read(),
  builder: (context, snapshot){
    if (snapshot.hasData) {
      bio=snapshot.data.toString(); //this isn't done
      return Text("");
    }
    else {
      return Text("Error occured");
    }
  }
);
return "";
}

Затем в TextField Я хочу показать, что хранится внутри bio, что должно быть содержимым "bio.txt".

child: Text(
 _ReadBio()== "" //always true if no error occured
 ? bio
 : "Tell us something about you...",
 ),

Но то, что показано, является первым значением bio, я не знаю почему.

1 Ответ

1 голос
/ 30 мая 2020

Я настоятельно рекомендую вам прочитать о FutureBuilder.

Вам не хватает точки od FutureBuilder, потому что это виджет для размещения в дереве виджетов того, что вы сделали помещается в функцию, которая возвращает пустую строку.

Вместо этого вы можете сделать это так:

Future<Widget> _readAndBuildBioWidget(){
   return FutureBuilder<String>(
     future: _read(),
     builder: (context, snapshot){
       if (snapshot.hasData) {
         bio=snapshot.data.toString(); //this isn't done
         return Text(bio ?? "");
       }
       else {
         return Text("Error occured");
      }
    }
  );
  return "";
}

@override
void build() {
   return Scaffold(
     child: _readAndBuildBioWidget(),
   );
}

Или вы можете сделать как показано ниже,

class _HomeScreenState extends State<HomeScreen> {
  var bio = "";

  Future<String> _read() async {
    try {
      final file = await _localBio;
      String body = await file.readAsString();
      return body;
    } catch (e) {
      return "Can't read";
    }
  }

  @override
  void initState() {
    _read().then((onValue) => bio = onValue);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text(bio ?? "")),
    );
  }
}

Обратите внимание на фрагмент кода, который я не тестировал. Я просто хотел дать общее представление.

...