0

所以继承的小部件对于将数据向下传递树很有用,但是如果继承的小部件是不可变的,我如何首先设置该数据?我正在尝试为 OTP auth 设置一个电话号码,然后在另一个屏幕上显示该号码。提供者目前对我来说有点先进,我该如何处理?谢谢你

4

2 回答 2

1

你必须在某个地方重建你的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));
 }
}
于 2020-12-25T20:14:03.423 回答
0

首先,您将为数据流使用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(),
    );
  }
}

通过Provider.of访问您的数据

class Widget3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    if (user == null) {
      return Login();
    } else {
      return Dashboard();
    }
  }
}

使用这种方法,您仍然需要访问小部件树下某处的数据。你不能上去,如果你想让一个小部件在树上听听树下发生的事情,你会想看看ChangeNotifier

于 2020-12-25T20:12:47.513 回答