首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ChangeNotifier提供者

关于ChangeNotifier提供者
EN

Stack Overflow用户
提问于 2021-02-07 11:49:08
回答 1查看 305关注 0票数 1

我正在使用提供程序管理状态,但是ChangeNotifierProvider不改变变量的值。当用户注册时,我想显示进度指示符。但是ChangeNotifierProvider并没有为我提供更新值,而是总是返回我的_isLoading = false;代码:

AuthServices.dart

代码语言:javascript
复制
class AuthServices with ChangeNotifier {
  bool _isLoading = false;

  bool get loading => _isLoading;

  ///Register User
  Future registerUser(
      {@required String email, @required String password}) async {
    try {
      _isLoading = true;
      notifyListeners();

      await http.post(
          BackEndConfigs.baseUrl +
              BackEndConfigs.version +
              BackEndConfigs.auth +
              EndPoints.register,
          body: {
            "email": email,
            "password": password
          }).then((http.Response response) {
        _isLoading = false;
        notifyListeners();
        return RegisterUser.fromJson(json.decode(response.body));
      });
    } catch (e) {
      print(e);
    }
  }
}

RegisterScreen.dart

代码语言:javascript
复制
class RegisterScreen extends StatefulWidget {
  @override
  _RegisterScreenState createState() => _RegisterScreenState();
}

class _RegisterScreenState extends State<RegisterScreen> {
  AuthServices _authServices = AuthServices();
  ProgressDialog pr;
  @override
  Widget build(BuildContext context) {
    pr = ProgressDialog(context, isDismissible: true);
    // print(status.loading);

    return Scaffold(
      appBar:
          customAppBar(context, title: 'Register Yourself', onPressed: () {}),
      body: _getUI(context),
    );
  }

  Widget _getUI(BuildContext context) {
    return LoadingOverlay(
      isLoading: false,
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 20.0),
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              VerticalSpace(10.0),
              GreyBoldText('Account Information'),
              VerticalSpace(20.0),
              IconsButtonRow([
                Icon(
                  FontAwesomeIcons.linkedinIn,
                  color: Color(0xff0e76a8),
                ),
                Icon(
                  FontAwesomeIcons.facebook,
                  color: Color(0xff3b5998),
                ),
                Icon(
                  FontAwesomeIcons.google,
                  color: Color(0xff4285F4),
                ),
              ]),
              VerticalSpace(10.0),
              GreyNormalText('or sign up with Email'),
              VerticalSpace(10.0),
              BlackBoldText("Email"),
              AppTextField(
                label: 'Email',
              ),
              BlackBoldText("Password"),
              AppTextField(
                label: 'Password',
              ),
              BlackBoldText("Confirm Password"),
              AppTextField(
                label: 'Confirm Password',
              ),
              VerticalSpace(20.0),
              ChangeNotifierProvider(
                create: (_) => AuthServices(),
                child: Consumer(
                  builder: (context, AuthServices user, _) {
                    return Text(user.loading.toString());
                  },
                ),
              ),
              AppButton(
                  buttonText: 'Next',
                  onPressed: () async {
                    // await pr.show();
                    _registerNewUser();
                  }),
              VerticalSpace(30.0),
              ToggleView(ToggleViewStatus.SignUpScreen),
              VerticalSpace(20.0),
            ],
          ),
        ),
      ),
    );
  }

  _registerNewUser() async {
    _authServices.registerUser(
        email: 'sdjfkldsdf@ssdfdsddfdgsffd.com', password: 'sldjsdfkls');
  }
}

main.dart

代码语言:javascript
复制
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
          scaffoldBackgroundColor: Colors.white,
          hintColor: FrontEndConfigs.hintColor,
          cursorColor: FrontEndConfigs.hintColor,
          fontFamily: 'Gilory'),
      home: RegisterScreen(),
    );
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-07 12:00:15

您创建了两个不同的AuthServices实例。

一个在你的州立课程开始,另一个使用ChangeNotifierProvider。在调用_registerNewUser时,使用在状态类中创建的AuthServices,而不是提供的类。

当在第一个AuthServices上调用AuthServices时,在Widget树中的ChangeNotifierProvider提供的第二个AuthServices的值不会改变。

尝试删除由state类创建的AuthServices实例,并将您的ChangeNotifierProvider移到小部件树上,以便您的所有函数共享相同的AuthServices实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66087546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档