繁体   English   中英

如何为我的所有小部件提供服务提供商?

[英]How I can have a Service provider to my All widgets?

我做了一个 Api class:


class Api
{
   // Token for authentication
   String bearerToken;

   // Generate a bearer token
   void login(String username,String password){
     // Some Implementation hidden for simplicity
   }

   void refreshToken(){
     // Some Implementation hidden for simplicity
   }

   void consumeAnEndpointUsingBearerToken(){
     // Some Implementation hidden for simplicity
   }
}

我做了一个登录小部件:


class LoginPage extends StatefulWidget {
  final String title;
  final Api api;
  const LoginPage({Key? key, required this.title, required this.api})
      : super(key: key);

  @override
  State<LoginPage> createState() => _LoginPageState(api);
}

class _LoginPageState extends State<LoginPage> {
  String username = '';
  String password = '';
  final Api api;
  
  _LoginPageState(this.api)

  void __setUsername(username) {
    this.username = username;
  }

  void __setPassword(password) {
    this.password = password;
  }

  void _login() {
    setState(() {
       api.login(username,password);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            AppTextInput(
              hintText: 'Username',
              onChanged: __setUsername,
            ),
            AppTextInput(
              obscureText: true,
              hintText: 'Password',
              onChanged: __setPassword,
            ),
            AppButton(
              onPressed: _login,
              text: 'Login',
            )
          ],
        ),
      ),
    );
  }
}

还有一个使用 api 的页面:

class ConsumeApi extends StatelessWidget {
    const ConsumeApi({Key? key, required this.title, required this.api})
      : super(key: key);

   // Dender another PAge
}

因此,每次我需要执行登录时,我都需要提供一个通用的 Api 实例并传递它。 有没有更好的方法来拥有一个通用的 Api 服务并使用某种服务提供商?

您可以使用 Get_It 进行依赖注入。

创建 injectionContainer 文件:

final sl = GetIt.instance;

void init(){
   sl.registerSingleton(() => Api());
}

在你的主要,你需要调用 init():

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  di.init();
  runApp(MyApp());
}

并且不要忘记导入 injectionContainer 文件:

import 'injection_container.dart' as di;

现在在每个小部件中,您都可以这样做:

sl<Api>().login();

现在,您在应用程序启动时为您创建了 API 的 object。

为此,您将需要使用服务定位器。 您可以使用广泛用于此的提供程序,但您需要为其传递上下文。 如果您不想传递上下文,可以使用get_it

我个人在我的项目中使用get_it ,它运行良好。

暂无
暂无

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

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