繁体   English   中英

为什么 GetXController inheritance 不工作?

[英]Why GetXController inheritance not working?

我对 flutter 很陌生。

我有一个名为LoginController的 controller,它从BaseController扩展,但在运行应用程序时出现以下错误。

基页代码

    class BasePage extends StatelessWidget {
  var baseController = Get.find<BaseController>();

  BasePage({Key? key}) : super(key: key);
  late Widget child;

  @override
  Widget build(BuildContext context) {
    return  Obx(() {
      return baseController.IsNetworkAvailable.value?child:const NoInternetPage();
    });
  }

  Widget GetWidget() {
    if (baseController.IsNetworkAvailable.value) {
      return child;
    } else {
      return const NoInternetPage();
    }
  }
}

这是 LoginPage 代码片段

   class LoginPage extends BasePage {
    LoginPage({Key? key}) : super(key: key)
    {
    loginController =Get.put(LoginController());

    child=RenderView();
    }
late LoginController loginController;


  TextStyle GetHeadingStyle()
  {
    return const TextStyle(
        color: Colors.grey,
        fontSize: 20
    );
  }

  Widget RenderView()
  {
    return Scaffold(
      body: Padding(
          padding: const EdgeInsets.fromLTRB(30,0,30,0),
          child: Obx((){
            return
              loginController.IsBusy.value?
              const Center(
                child: SizedBox(
                  height: 60,
                  width: 60,
                  child: CircularProgressIndicator(
                    strokeWidth: 5.0,
                    valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
                  ),
                ),
              ):
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  TextField(
                      controller: loginController.domainController,
                      decoration: const InputDecoration(labelText: 'Domain',
                          border: OutlineInputBorder())
                  ),
                  SizedBox(height: 20),
                  TextField(
                      controller: loginController.usernameController,
                      decoration: const InputDecoration(labelText: 'Username',
                          border: OutlineInputBorder())
                  ),
                  const SizedBox(height: 20),
                  TextField(
                      controller: loginController.passwordController,
                      obscureText: true,
                      decoration: const InputDecoration(labelText: 'Password',
                          border: OutlineInputBorder())
                  ),
                  const SizedBox(height: 20),
                  SizedBox(
                    width: 150,
                    height: 40,
                    child:
                    ElevatedButton(onPressed: ()=>{
                      loginController.doLogin(LoginSuccess,LoginFailed)
                    },
                      child:const Text('Login'
                          ,style: TextStyle()),
                    ),
                  ),
                ],
              );
          })
      ),
    );
  }
  void LoginSuccess() {
    loginController.IsBusy.value = false;
    Get.snackbar("Success", "Login Success",backgroundColor: Colors.green,colorText: Colors.white);
    var storage = GetStorage();
    storage.write("IsLoggedIn", true);
    Get.off(MainPage());
  }
  void LoginFailed()
  {
    loginController.IsBusy.value=false;
    Get.snackbar("Failed", "Login Failed",backgroundColor: Colors.red,colorText: Colors.white);
  }

}

登录 Controller 代码

   class LoginController extends BaseController {
  TextEditingController domainController = TextEditingController();
  TextEditingController usernameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  LoginController() {}

  void doLogin(Function loginSuccess, Function loginFailed) async {
    if (await checkConnection()) {
      //await RestService().PostRequest(Resources.LOGIN_URL,loginData , loginSuccess, loginFailed);
    }
  }
}

底座 Controller 代码

    class BaseController extends GetxController {
  var IsBusy = false.obs;
  var IsNetworkAvailable = false.obs;
  var IsServerDown = false.obs;

  BaseController() {}

  Future<bool> checkConnection(
      {bool setIsBusy = true, bool setNetworkAvailable = true}) async {
    var result = await ConnectivityService.checkConnection();
    bool isConnected = result != ConnectivityResult.none;
    if (setIsBusy) {
      IsBusy.value = isConnected;
    }
    if (setNetworkAvailable) {
      IsNetworkAvailable.value = isConnected;
    }
    return isConnected;
  }
}

注意:我假设初始化Get.put(LoginController())也应该自动初始化 BaseController,因为它继承自 BaseController。

尝试在 LoginController 中像这样调用 BaseController。

class LoginController extends GetxController {
  TextEditingController domainController = TextEditingController();
  TextEditingController usernameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  LoginController() {}

  void doLogin(Function loginSuccess, Function loginFailed) async {
    if (Get.putAsync(() => BaseController(). checkConnection())) {
      //await RestService().PostRequest(Resources.LOGIN_URL,loginData , loginSuccess, loginFailed);
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM