在不使用ConsumerStatefulWidget的情况下,我如何在flutter静态小部件中使用ref



我想在我创建的小部件中使用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),
],
),
);
}

嗯,您有一些选择,但最好不要使用静态方法,因为这是一种糟糕的做法。

无论如何,解决方案是:

  1. 将WidgetRef传递到buildLogin
  2. 将登录桥转换为提供商
  3. 将小部件转换为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),
],
);
}
),
);

}

最新更新