Flutter初始化后执行逻辑插件miladtech_after_init的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter初始化后执行逻辑插件miladtech_after_init的使用

miladtech_after_init 插件为状态fulWidget添加了一个 didInitState() 生命周期方法,在该方法中可以安全地访问继承小部件。

InheritedWidget 在 Flutter 框架中被广泛使用。许多状态管理包如 ScopedModelProvider 也使用了它。不幸的是,InheritedWidgetsStateinitState() 方法中不可用。Flutter 文档指出:

/// 你不能在这个方法中使用 [BuildContext.inheritFromWidgetOfExactType]。
/// 然而,[didChangeDependencies] 将在该方法之后立即调用,并且可以在那里使用 [BuildContext.inheritFromWidgetOfExactType]。

此插件包含一个简单的 State 类混入,提供了一个名为 didInitState() 的新方法。该方法仅在 initState() 之后、didChangeDependencies()build() 之前被调用一次。你可以在此方法中安全地访问 InheritedWidgets 并使用它们来执行你的小部件的任何设置任务。

方法顺序

使用此库后,State 方法按以下顺序调用:

  1. initState()
  2. didInitState() ← 新!
  3. didChangeDependencies()
  4. build()

示例

import 'package:flutter/material.dart';
import 'package:miladtech_after_init/miladtech_after_init.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Example(),
      ),
    ),
  );
}

class Example extends StatefulWidget {
  [@override](/user/override)
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> with AfterInitMixin<Example> {
  Size size;

  /// 这个方法像往常一样首先被调用。
  [@override](/user/override)
  void initState() {
    super.initState();
    // 你的代码在这里
  }

  /// 这个方法在 initState() 之后被调用一次。
  /// 可以在此安全地访问继承的小部件。
  [@override](/user/override)
  void didInitState() {
    // 不需要调用 super.didInitState()。
    // 不需要调用 setState(),因为 Flutter 会在 build() 中自动调用。
    size = MediaQuery.of(context).size;
  }

  /// 这个方法在 didInitState() 之后被调用。
  /// 以及在小部件的依赖关系发生变化时,像往常一样。
  [@override](/user/override)
  void didChangeDependencies() {
    super.didChangeDependencies();
    // 你的代码在这里
  }

  /// 最终,像往常一样被调用。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Text(size.toString()),
    );
  }
}

这只是一个简单的示例。通常情况下,你会在 didInitState() 中执行一些更有用的操作,例如访问设置数据或订阅来自 InheritedWidgetStream

替代方案

对于 initState() 的限制,一种常见的解决方法是延迟执行需要访问 InheritedWidget 的代码:

[@override](/user/override)
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) {
    print(MediaQuery.of(context).size);
  });
}

更多关于Flutter初始化后执行逻辑插件miladtech_after_init的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter初始化后执行逻辑插件miladtech_after_init的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,miladtech_after_init 是一个 Flutter 插件,用于在 Flutter 应用初始化完成后执行特定的逻辑。虽然我不能提供具体的插件实现细节(因为这通常属于插件作者的私有代码),但我可以向你展示如何使用一个类似的自定义插件或逻辑来实现相同的功能。

以下是一个示例,展示如何在 Flutter 应用中创建一个自定义的初始化完成回调机制。这个示例不会直接使用 miladtech_after_init 插件,但会模拟其功能。

1. 创建 Flutter 插件或功能

首先,你可以在 Flutter 项目中创建一个服务类来处理初始化后的逻辑。

app_initializer.dart

import 'package:flutter/material.dart';

class AppInitializer {
  static final AppInitializer _instance = AppInitializer._internal();

  factory AppInitializer() => _instance;

  AppInitializer._internal();

  // 用于存储初始化完成后的回调
  final List<VoidCallback> _afterInitCallbacks = [];

  // 标记应用是否已初始化
  bool _isInitialized = false;

  // 初始化应用并调用所有回调
  void initializeApp() {
    if (!_isInitialized) {
      // 这里可以放置一些初始化逻辑,比如获取用户数据、配置服务等
      print("App is initializing...");
      
      // 模拟初始化完成
      Future.delayed(Duration(seconds: 2), () {
        print("App initialization complete.");
        _isInitialized = true;
        
        // 调用所有回调
        _afterInitCallbacks.forEach((callback) => callback());
        _afterInitCallbacks.clear(); // 可选:调用后清空回调列表
      });
    } else {
      print("App is already initialized.");
    }
  }

  // 注册初始化完成后的回调
  void registerAfterInitCallback(VoidCallback callback) {
    if (!_isInitialized) {
      _afterInitCallbacks.add(callback);
    } else {
      // 如果已经初始化,立即调用回调
      callback();
    }
  }
}

2. 在 Flutter 应用中使用该服务

接下来,在你的 Flutter 应用中使用这个服务来注册初始化完成后的回调。

main.dart

import 'package:flutter/material.dart';
import 'app_initializer.dart';

void main() {
  final appInitializer = AppInitializer();

  // 注册初始化完成后的回调
  appInitializer.registerAfterInitCallback(() {
    print("Executing logic after app initialization.");
    // 在这里放置你需要在初始化完成后执行的逻辑
    runApp(MyApp());
  });

  // 初始化应用
  appInitializer.initializeApp();
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, Flutter!'),
      ),
    );
  }
}

解释

  1. AppInitializer 类:负责应用初始化状态和回调管理。
  2. initializeApp 方法:模拟应用初始化过程,并在完成后调用所有注册的回调。
  3. registerAfterInitCallback 方法:允许其他组件在应用初始化完成后注册回调。
  4. main 函数:在应用启动时注册回调并初始化应用。

这个示例展示了如何在 Flutter 应用中创建一个自定义的初始化机制,虽然它并不是 miladtech_after_init 插件的直接实现,但它提供了相同的功能:在应用初始化完成后执行特定的逻辑。如果你确实需要使用 miladtech_after_init 插件,请参考其官方文档和示例代码来进行集成。

回到顶部