我想在我创建的小部件中使用ref.read()
。但它需要ConsumerStatefulWidget才能使用。如何在下面的小部件中使用ref.read()
。
class LoginWidget{
static SizedBox buildLogin(BuildContext context,TextEditingController email,TextEditingController password){
return SizedBox(
width: MediaQuery.of(context).size.width,
child: Column(
children: [
const SizedBox(height: 50),
emailTextField(),
const SizedBox(height: 15),
passwordTextField(),
const SizedBox(height: 15),
loginButton(context),
const SizedBox(height: 15),
buildBoldText("Or",Colors.black),
const SizedBox(height: 15),
icons(context),
const SizedBox(height: 15),
buildBoldText("Forgot your password?", Colors.blue),
const SizedBox(height: 45),
],
),
);
}
嗯,您有一些选择,但最好不要使用静态方法,因为这是一种糟糕的做法。
无论如何,解决方案是:
- 将WidgetRef传递到buildLogin
- 将登录桥转换为提供商
- 将小部件转换为ConsumerWidget或ConsumerStatefulWidget(最佳选项(
您可以像这样用Consumer
小部件包装Column以访问ref
对象。
class LoginWidget{
static SizedBox buildLogin(BuildContext context,TextEditingController email,TextEditingController password){
return SizedBox(
width: MediaQuery.of(context).size.width,
child: Consumer(
builder: (_, ref, __) {
// you can now access the ref object here.
// Ex. final provider = ref.watch(testProvider);
return Column(
children: [
const SizedBox(height: 50),
emailTextField(),
const SizedBox(height: 15),
passwordTextField(),
const SizedBox(height: 15),
loginButton(context),
const SizedBox(height: 15),
buildBoldText("Or",Colors.black),
const SizedBox(height: 15),
icons(context),
const SizedBox(height: 15),
buildBoldText("Forgot your password?", Colors.blue),
const SizedBox(height: 45),
],
);
}
),
);
}