flutter 我应该如何实现init方法?在有状态的还是无状态的小部件中?

xqnpmsa8  于 2023-02-25  发布在  Flutter
关注(0)|答案(4)|浏览(191)

对于小部件使用初始化方法的经验法则是什么?我应该使用:

*经典的有状态小部件方法?

  • 还是坚持使用B.无状态小部件方法更好?

从我的测试来看,这两种方法似乎都有效。在代码减少方面,B.方法似乎更好、更短、更干净、更可读。性能方面呢?我还可能遗漏了什么?

a64a0gku

a64a0gku1#

初始化控制器应该是一次性操作;如果在StatelessWidgetbuild*方法上执行此操作,则每次重新构建此小部件时都会触发此操作。如果在StatefulWidgetinitState*上执行此操作,则在初始化状态时将此对象插入树中时,仅调用一次此操作。

weylhg0b

weylhg0b2#

我正在寻找在无状态小部件的构造函数中传递的值的基础上初始化一些值。因为我们都知道,对于无状态小部件,我们有initState()覆盖回调来初始化某些值等。但对于无状态小部件,默认情况下没有提供选项。如果我们在构建方法中这样做,它将在每次视图更新时被调用。所以我正在做下面的代码。它工作。希望它能帮助到别人。

import 'package:flutter/material.dart';

class Sample extends StatelessWidget {
  final int number1;
  final int number2;

  factory Sample(int passNumber1, int passNumber2, Key key) {
    int changeNumber2 = passNumber2 *
        2; //any modification you need can be done, or else pass it as it is.
    return Sample._(passNumber1, changeNumber2, key);
  }

  const Sample._(this.number1, this.number2, Key key) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text((number1 + number2).toString());
  }
}
yhqotfr8

yhqotfr83#

无论是函数还是小部件构建中的其他内容,只要您执行热重载或页面刷新,都会运行,但对于initState,它将在启动应用或在IDE中重新启动应用时运行一次,例如在StatefulWidget小部件中,您可以用途:

void initState() {
    super.initState();
    WidgetsBinding.instance!
        .addPostFrameCallback((_) => your_function(context));
  }
envsm3lx

envsm3lx4#

要使用initState()、dispose()等有状态功能,您可以使用以下代码,这将为您提供自由:)

class StatefulWrapper extends StatefulWidget {
  final Function onInit;
  final Function onDespose;
  final Widget child;
  const StatefulWrapper(
      {super.key,
      required this.onInit,
      required this.onDespose,
      required this.child});

  @override
  State<StatefulWrapper> createState() => _StatefulWrapperState();
}

class _StatefulWrapperState extends State<StatefulWrapper> {
  @override
  void initState() {
    // ignore: unnecessary_null_comparison
    if (widget.onInit != null) {
      widget.onInit();
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  @override
  void dispose() {
    if (widget.onDespose != null) {
      widget.onDespose();
    }
    super.dispose();
  }
}

使用上面的代码,您可以创建包含有状态小部件方法的有状态 Package 器

  • 要在小部件树中使用Stateful Wrapper,您只需使用Stateful Wrapper Package 小部件,并提供要在initdispose上执行的方法或操作。

Github上提供的代码

注意:您可以根据需要随时在有状态 Package 类中添加或删除方法!!

快乐飞翔!!

相关问题