Flutter 常用方法

作者: 江水东流 | 来源:发表于2023-11-10 19:02 被阅读0次

等待多个异步任务全部结束
1、使用 Future.wait()

Future<void> fetchData() async {
  try {
    var response1 = http.get(Uri.parse('https://example.com/data1'));
    var response2 = http.get(Uri.parse('https://example.com/data2'));
    var results = await Future.wait([response1, response2]);
    var data1 = jsonDecode(results[0].body);
    var data2 = jsonDecode(results[1].body);
    print(data1);
    print(data2);
  } catch (e) {
    print('Error: $e');
  }
}

2、使用 Stream 和 StreamController:Stream 和 StreamController 是 Dart 中用于处理流的类,它们可以用于实现多个异步请求的并发处理和结果组合。我们可以创建多个 StreamController,并将它们的流合并到一个单独的流中,然后使用 Stream 的各种操作符来处理结果。

Future<void> fetchData() async {
  try {
    var controller1 = StreamController();
    var controller2 = StreamController();
    http.get(Uri.parse('https://example.com/data1'))
        .then((response) => controller1.add(response.body));
    http.get(Uri.parse('https://example.com/data2'))
        .then((response) => controller2.add(response.body));
    var results = await StreamZip([controller1.stream, controller2.stream]).toList();
    var data1 = jsonDecode(results[0]);
    var data2 = jsonDecode(results[1]);
    print(data1);
    print(data2);
  } catch (e) {
    print('Error: $e');
  }
}

等待组件渲染完成

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
      showDialog(
          context: context,
          builder: (context) {
            return const AlertDialog(
              title: Text('AlertDialog'),
            );
          });
    });
    print("initState-------");
  }

生命周期阶段执行的函数
1、initState
调用次数:1次

插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。

2、didChangeDependencies
调用次数:多次

初始化时,在initState()之后立刻调用
当依赖的InheritedWidget rebuild,会触发此接口被调用
实测在组件可见状态变化的时候会调用
3、build
调用次数:多次

初始化之后开始绘制界面
setState触发的时候会
4、didUpdateWidget
调用次数:多次

组件状态改变时候调用

5、deactivate
当State对象从树中被移除时,会调用此回调,会在dispose之前调用。

页面销毁的时候会依次执行:deactivate > dispose

6、dispose
调用次数:1次

生命周期.png

监听app生命周期

 class xxx with WidgetsBindingObserver

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
}

  @override
  void dispose() {
    WidgetsBinding.instance?.removeObserver(this);
    super.dispose();
  }
  ///监听应用生命周期变化
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print(':didChangeAppLifecycleState:$state');
    switch (state) {
      case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
        break;
      case AppLifecycleState.resumed: //从后台切换前台,界面可见
        //fix Android压后台首页状态栏字体颜色变白,详情页状态栏字体变黑问题
        changeStatusBar();
        break;
      case AppLifecycleState.paused: // 界面不可见,后台
        break;
      case AppLifecycleState.detached: // APP结束时调用
        break;
    }
  }

相关文章

网友评论

    本文标题:Flutter 常用方法

    本文链接:https://www.haomeiwen.com/subject/cshfyrtx.html