Снимок FutureBuilder Данные ничего не возвращают, почему? - PullRequest
0 голосов
/ 14 января 2020

Попытка получить сохраненные данные с помощью SharedPreferences, но не работает ..

my main.dart:

  Widget build(BuildContext context) {
    return StreamProvider<User>.value(
      value: AuthService().user,
      child: FutureBuilder<String>(
        future: SaadConstants.setValueFromLocal('app_lang','ar'),
        builder: (BuildContext context, AsyncSnapshot<String> snapshot){
          return MaterialApp(
            debugShowCheckedModeBanner: false,
            home: Scaffold(
              body:Wrapper(),
            ),
          );
        }
      ),
    );
  }

my wrapper:

@override
  Widget build(BuildContext context) {

    final user = Provider.of<User>(context);
    if (user==null) {
      return FutureBuilder(
        future: SaadConstants.getValueFromLocal('app_lang'),
        builder: (BuildContext contect , AsyncSnapshot<String> snapshot){
          if (snapshot.hasData) {
            return Text('has data');
          }
          else return Text('None'); 
        }
      );
    }
    else{
      return Text('connect');
    }

возвращает этот виджет: Текст ('Нет') ..

my setValue Функция:

  static Future<String> setValueFromLocal(String key, String value) async { // Async func to handle Futures easier; or use Future.then
    SharedPreferences perfs = await SharedPreferences.getInstance();
    perfs.setString(key.toString(),value.toString());
  }

my getValue Функция:


  static Future<String> getValueFromLocal(String key) async { // Async func to handle Futures easier; or use Future.then
    SharedPreferences perfs = await SharedPreferences.getInstance();
    return perfs.getString(key);
  }

1 Ответ

1 голос
/ 14 января 2020

Попробуйте,

return FutureBuilder(
    future: SaadConstants.getValueFromLocal('app_lang'),
    builder: (BuildContext contect, AsyncSnapshot<String> snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting)
        return Center(child: CircularProgressIndicator());
      else if (snapshot.hasData)
        return Text("DATA: ${snapshot.data}");
      else if (snapshot.hasError)
        return Text("ERROR: ${snapshot.error}");
      else
        return Text('None');
    }
);

Ваш main.dart также должен реализовать эти условия.

Widget build(BuildContext context) {
  return StreamProvider<User>.value(
    value: AuthService().user,
    child: MaterialApp(
      debugShowCheckedModeBanner: false,
      home: FutureBuilder<String>(
          future: SaadConstants.setValueFromLocal('app_lang', 'ar'),
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting)
              return Center(child: CircularProgressIndicator());
            else if (snapshot.hasError)
              return Text("ERROR: ${snapshot.error}");
            else
              return Scaffold(
                body: Wrapper(),
              );
          }
      ),
    ),
  );
}
...