[英]Flutter: (How) Can I have a PageView of widgets that each rely on Provider?
[英]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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.