【问题标题】:FutureBuilder snapshot Data does not return anything , Why?FutureBuilder 快照数据没有返回任何东西,为什么?
【发布时间】:2020-05-01 10:32:06
【问题描述】:

试图通过 SharedPreferences 获取存储的数据但不起作用..

我的 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(),
            ),
          );
        }
      ),
    );
  }

我的包装:

@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');
    }

它返回这个小部件:Text('None') ..

我的 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());
  }

我的 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);
  }

【问题讨论】:

    标签: flutter async-await sharedpreferences


    【解决方案1】:

    试试这个,

    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(),
                  );
              }
          ),
        ),
      );
    }
    

    【讨论】:

    • 它返回错误:MissingPluginException(No implementation Found for method getAll on channel plugins.flutter.io/shared_preferences)
    • 在 github 上找到 : No implementation found for method getAll on channel plugins.flutter.io __第一次设置插件时会出现上述情况,因此必须重新安装... 卸载并重新安装您的应用程序.... shareeditflag
    • 是的,尝试重新安装您的应用程序。这不是来自FutureBuilder 的问题。
    • 这次它返回:return Text('None'); .. :\
    • 这可能是因为在您的共享偏好中没有找到给定键的值。
    猜你喜欢
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多