0

我正在开发一个使用 Flutterscoped_model作为状态管理器的项目。

但是有一点我不确定。我实际上在每次构建时都调用我的 API,这对我来说看起来很奇怪。使用状态管理进行 API 调用的良好做法是scoped_model什么?这是我实际的小部件代码:

class RunsListPage extends StatelessWidget {
  final ScopedRuns scopedRuns = ScopedRuns();

  @override
  Widget build(BuildContext context) {
    this.scopedRuns.getRuns();
    return ScopedModel<ScopedRuns>(
        model: this.scopedRuns,
        child: ScopedModelDescendant<ScopedRuns>(
          builder: (context, child, scopedRuns) {
            return Column(
              children: <Widget>[
                Expanded(
                  child: Stack(
                    children: <Widget>[
                      LoadingIndicatorWidget(
                        visible: scopedRuns.isLoading,
                      ),
                      RefreshIndicator(
                        color: Theme.of(context).primaryColor,
                        onRefresh: () async => this.scopedRuns.getRuns(),
                        child: RunsList(
                            runsList: scopedRuns.runs ?? [],
                            visible: !scopedRuns.isLoading),
                      ),
                    ],
                  ),
                )
              ],
            );
          },
        ));
  }}

这是我的模型中的getRuns()方法ScopedRuns

  getRuns() async {
    _isLoading = true;
    notifyListeners();
    _runs = await APIService.getRuns();
    _isLoading = false;
    notifyListeners();
  }
4

2 回答 2

0

build方法应该是纯的,没有副作用。因此,您可以: 1.在课程getRuns开始期间调用该方法ScopedRuns

class ScopedRuns {
  ScopedRuns(){
    getRuns();
  }
}

2.转换RunsListPage成statfeul widget,期间调用方法initState

class RunsListPage extends StatefulWidget {
  @override
  _RunsListPageState createState() => _RunsListPageState();
}

class _RunsListPageState extends State<RunsListPage> {
  final ScopedRuns scopedRuns = ScopedRuns();

  @override
  void initState() {
    super.initState();
    scopedRuns.getRuns();
  }

  @override
  Widget build(BuildContext context) { ... }
于 2019-08-01T07:55:45.767 回答
0

请注意,当应用程序需要构建时,您在构建中进行的任何方法调用都可能会被多次调用,这相当多,您应该将您的方法放在 initState() 中;所以它只会被调用一次。

于 2019-08-01T08:31:17.720 回答