【问题标题】:How to set data in an inherited widget from a another widget?如何在从另一个小部件继承的小部件中设置数据?
【发布时间】:2021-04-03 15:17:55
【问题描述】:

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

【问题讨论】:

    标签: flutter flutter-provider mobile-development state-management flutter-state


    【解决方案1】:

    首先,您将使用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

    【讨论】:

      【解决方案2】:

      你必须在某个地方重建你的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));
       }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 2018-10-30
        • 2020-02-22
        • 2020-08-08
        • 1970-01-01
        • 2020-08-20
        • 2020-11-15
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多