【问题标题】:Flutter bad practice to execute functions inside Widget build?在 Widget 构建中执行函数的 Flutter 坏习惯?
【发布时间】:2023-01-17 17:26:02
【问题描述】:

我想永久收听当前主题,因为我在使用 systemchrom 时遇到了一些问题,所以我找到了一个解决方法,我在 Widget 构建中调用了 BlocProvider.of。总的来说,它现在工作得很好,但这是一个干净的解决方案还是不是一个好的做法,如果最后,是否有更好的方式永久收听 SystemUiOverlayStyle ?

@override
  Widget build(BuildContext context) {
BlocProvider.of<SysUiCubit>(context).changeTheme(context, isDarkMode);
 return BlocBuilder<SysUiCubit, SysUiState>(
      builder: (context, state) {
        return AnnotatedRegion<SystemUiOverlayStyle>(

我在构建中添加了一个小逻辑,因此只有在主题更改时才会调用 BlocProvider:

bool buildOnce =false;
  @override
  Widget build(BuildContext context) {

    bool isDarkMode = Theme.of(context).brightness == Brightness.dark;
    if(!buildOnce){
      setPrev(Theme.of(context).brightness == Brightness.dark);
    buildOnce=true;
    }
    if(darkmodePrev != isDarkMode){
      BlocProvider.of<SysUiCubit>(context).changeTheme(context, isDarkMode);
      buildOnce=false;
    }

我在我的应用程序的另一点上问自己同样的事情:

  @override
  Widget build(BuildContext context) {
    final todo= context.watch<TodoListCubit>().state.todo;

    return BlocListener<TodoListCubit, TodoListState>(
        listener: (context, state) {

这里我有一个待办事项列表,我在构建函数中调用了 context.watch - 同样的问题 - 我没有找到一个更干净的解决方案来在每次重建小部件时更新待办事项列表,所以这是好的还是不好的做法?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    不良做法

    在build 中定义一个function

    良好做法(待遵循)

    在 build 之外定义一个 function 并在函数内部调用它,这将在需要时帮助您 rebuild 小部件。


    对于您的问题,我建议您在 theme 更改时发出更改,并使用 buildWhen 重建小部件,而不是将此工作嵌入到构建中。

    那将被认为是更简洁的代码,如果这是您正在寻找的。


    使用来自官方docs的示例:

    class ThemeCubit extends Cubit<ThemeData> {
      /// {@macro brightness_cubit}
      ThemeCubit() : super(_lightTheme);
    
      static final _lightTheme = ThemeData(
        floatingActionButtonTheme: const FloatingActionButtonThemeData(
          foregroundColor: Colors.white,
        ),
        brightness: Brightness.light,
      );
    
      static final _darkTheme = ThemeData(
        floatingActionButtonTheme: const FloatingActionButtonThemeData(
          foregroundColor: Colors.black,
        ),
        brightness: Brightness.dark,
      );
    
      /// Toggles the current brightness between light and dark.
      void toggleTheme() {
        emit(state.brightness == Brightness.dark ? _lightTheme : _darkTheme);
      }
    }
    
    
    BlocBuilder<BlocA, BlocAState>(
      buildWhen: (previousState, state) {
        // return true/false to determine whether or not // ? add your logic here
        // to rebuild the widget with state
      },
      builder: (context, state) {
        // return widget here based on BlocA's state
      }
    )
    

    【讨论】:

    • 请找到更新的帖子,希望对您有所帮助
    猜你喜欢
    • 2011-12-28
    • 2021-06-27
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2010-11-14
    • 2016-08-07
    相关资源
    最近更新 更多