由Fflutter中的提供程序调用api的正确方法?

时间:2019-12-26 10:50:15

标签: flutter provider-model

我一直在努力开发一款应用,该应用可以调用api并在TextField中更新数据
用于状态管理的提供程序,这里是代码。

class ProfileProvider with ChangeNotifier {
  var profileData;
  String _url = "http://10.0.2.2:3000/api/v1/user/loggedin_user";

  void getData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var token = prefs.getString('token');
    var data = await http.get(
      _url,
      headers: {
        "accept": "application/json",
        "content-type": "application/json",
        'Token': token,
      },
    );
    var infoOfPerson = json.decode(data.body);
    profileData = new ProfileObject(
      name: infoOfPerson['name'],
      mobile: infoOfPerson['mobile'],
      email: infoOfPerson['email'],
      role: infoOfPerson['role'],
    );
    notifyListeners();
  }

  ProfileObject get profileInfo {
    return profileData;
  }
}

我的数据很好,现在我必须在UI中显示它,但有时填充了数据,有时却没有。有人可以给我指出正确的方向的原因。

这是UI的代码。

 class Profile extends StatefulWidget {
  @override
  _ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
  final emailController = TextEditingController(text: '');
  final nameController = TextEditingController(text: '');
  final mobileController = TextEditingController(text: '');
  var _isInit = true;

  @override
  void didChangeDependencies() {
    if (_isInit) {
      final profileData = Provider.of<ProfileProvider>(context);
      profileData.getData();
      if (profileData.profileInfo != null) {
        emailController.text = profileData.profileInfo.name;
        nameController.text = profileData.profileInfo.email;
        mobileController.text = profileData.profileInfo.mobile;
      }
      _isInit = false;
      super.didChangeDependencies();
    }
  }

  @override
  Widget build(BuildContext context) {
    final profileData = Provider.of<ProfileProvider>(context);

    return Scaffold(
      drawer: NavigationDrawer(),
      body: profileData.profileInfo == null
          ? Center(
              child: CircularProgressIndicator(),
            )
          : Builder(
              builder: (context) => SingleChildScrollView(
                child: Padding(.....

在填充下面,有一个正常的TextField,有人可以告诉我为什么有时填充数据,有时填充为空,即使我用CircularProgressIndicator()包装并检查{{1 }}不在那儿工作。没有显示加载程序,也没有加载数据。

谢谢

1 个答案:

答案 0 :(得分:0)

我已经创建了一个名为nextTick的函数,我在initState中对其进行了调用,并且该函数现在可以使用,但是想看看其他方法

...$Value

然后按如下所示使用它

void nextTick(Function callback, [int milliseconds = 0]) {
  Future.delayed(Duration(milliseconds: 0)).then((_) {
    callback();
  });
}

编辑:我存储了几个变量以在ui上管理它们,例如isLoading,hasError和errorMessage。这是我的提供程序类

  @override
  void initState() {
    super.initState();
    nextTick((){
      ProfileProvider profileProvider = Provider.of<ProfileProvider>(context);
      profileProvider.getProfile();
    });
  }