如何在从另一个小部件继承的小部件中设置数据?
How to set data in an inherited widget from a another widget?
所以继承的小部件对于将数据向下传递树很有用,但是如果继承的小部件是不可变的,我如何首先设置该数据?
我正在尝试为 OTP 验证设置一个 phone 号码,然后在另一个屏幕上显示该号码。 Provider 目前对我来说有点先进,我该如何处理?
谢谢
首先,您将为数据流使用 StreamProvider(与使用 StreamBuilder 相同):
class Widget1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
value: AuthService().user,
child: Wrapper(),
);
}
}
下一个小部件没有所需的数据
class Widget2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Widget3(),
);
}
}
访问您的数据
class Widget3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
if (user == null) {
return Login();
} else {
return Dashboard();
}
}
}
使用这种方法,您仍然需要访问小部件树下方某处的数据。你不能上去,如果你想让树上的小部件能够监听树下发生的事情,你会想看看 ChangeNotifier
您必须在某个地方重建您的 InheritedWidget
。
您可以为它使用任何阶段管理,例如您可以使用 StatefulWidget
:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyInheritedWidget extends InheritedWidget {
final int counter;
MyInheritedWidget({Key key, this.counter, Widget child})
: super(key: key, child: child);
@override
bool updateShouldNotify(MyInheritedWidget oldWidget) {
return oldWidget.counter != counter;
}
static MyInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: MyInheritedWidget(counter: _counter, child: CounterWidget()),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_counter++;
});
},
),
);
}
}
class CounterWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text("${MyInheritedWidget.of(context).counter}",
style: TextStyle(fontSize: 100));
}
}
所以继承的小部件对于将数据向下传递树很有用,但是如果继承的小部件是不可变的,我如何首先设置该数据? 我正在尝试为 OTP 验证设置一个 phone 号码,然后在另一个屏幕上显示该号码。 Provider 目前对我来说有点先进,我该如何处理? 谢谢
首先,您将为数据流使用 StreamProvider(与使用 StreamBuilder 相同):
class Widget1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
value: AuthService().user,
child: Wrapper(),
);
}
}
下一个小部件没有所需的数据
class Widget2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Widget3(),
);
}
}
访问您的数据
class Widget3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
if (user == null) {
return Login();
} else {
return Dashboard();
}
}
}
使用这种方法,您仍然需要访问小部件树下方某处的数据。你不能上去,如果你想让树上的小部件能够监听树下发生的事情,你会想看看 ChangeNotifier
您必须在某个地方重建您的 InheritedWidget
。
您可以为它使用任何阶段管理,例如您可以使用 StatefulWidget
:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyInheritedWidget extends InheritedWidget {
final int counter;
MyInheritedWidget({Key key, this.counter, Widget child})
: super(key: key, child: child);
@override
bool updateShouldNotify(MyInheritedWidget oldWidget) {
return oldWidget.counter != counter;
}
static MyInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: MyInheritedWidget(counter: _counter, child: CounterWidget()),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_counter++;
});
},
),
);
}
}
class CounterWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text("${MyInheritedWidget.of(context).counter}",
style: TextStyle(fontSize: 100));
}
}