如何在 Flutter 中读取渲染树之外的存储值

use*_*307 5 flutter flutter-redux

我正在学习 flutter 并尝试与 redux 集成以进行商店管理。

我看到的所有示例都在小部件的渲染部分访问,例如:

Padding(
  padding: EdgeInsets.all(2.0),
  child: StoreConnector<AppState, List<Photo>>(
        converter: (store) => store.state.photos,
        builder: (_, photos) {
          return GridView.builder(
            itemCount: photos.length,
            itemBuilder: (BuildContext context, int index) {
              final photoUrl = photos[index].portrait;
              return Padding(
                padding: EdgeInsets.all(1.0),
                child: new Image.network(
                  photoUrl,
                  fit: BoxFit.cover,
                ),
              );
            },
            gridDelegate:                                    
            // .......
Run Code Online (Sandbox Code Playgroud)

但是如何从 initState 中的商店获取一个值,并检测该值是否发生变化,例如?我可以在渲染树之外有一个特定值的监听器吗?

谢谢你。

为清楚起见进行编辑,我正在寻找的是一些 Flutter 等价于 react 的 useSelector 能够在 useEffect 中获取值的变化

编辑:我在想一个选项(虽然不是问题的答案)可能是从父级传递值,然后在子级中使用 didChangeDependencies()

MRa*_*iaz 0

我对 React 的 useSelector 和 redux 不太了解,但在 Flutter 中你可以将函数作为参数传递,这有助于更改不同小部件之间的值。

例子

  class MainClass extends StatefulWidget {
  MainClass({Key key}) : super(key: key);

  @override
  _MainClassState createState() => _MainClassState();
}

class _MainClassState extends State<MainClass> {
  int value = 0;

  changeValue(int newValue) {
    setState(() {
      value = newValue;
    });
  }

  @override
  void initState() {
    print('value is $value');
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[
          InnerClass2(
            value: value,
          ),
          InnerClass(
            changeValue: changeValue,
          ),
        ],
      ),
    );
  }
}

class InnerClass extends StatefulWidget {
  Function changeValue;

  InnerClass({@required this.changeValue, Key key}) : super(key: key);

  @override
  _InnerClassState createState() => _InnerClassState();
}

class _InnerClassState extends State<InnerClass> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        onPressed: () {
          widget.changeValue(2);
        },
      ),
    );
  }
}

class InnerClass2 extends StatelessWidget {
  final int value;
  const InnerClass2({@required this.value, Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(value.toString()),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)