Можно ли оставить открытыми потоки во флаттере? - PullRequest
1 голос
/ 08 мая 2020

TL; DR: Могу ли я оставить потоки открытыми во флаттере?

У меня есть определенный пользовательский интерфейс, который требует другого стиля панели приложений, а не обычного, где боковой ящик сдвигается слева вверх по главному экрану. Дизайн больше похож на то, что весь главный экран перемещается вправо, а внизу есть слой, который действует как боковая панель.

Чтобы было понятно, подумайте об этом как о том, что ящик включен вверху экрана и движется, я хочу наоборот. Я хочу, чтобы главный экран был вверху, а ящик внизу (с точки зрения z-индекса), а главный экран двигался.

Я создал два виджета, один для ящика приложений и еще один для главного экрана, и использование виджета стека и некоторых анимаций заставило его работать. Для регистрации обратной связи пользователя о том, какой экран он / она хочет открыть, я передаю данные из этого виджета боковой панели в виджет главного экрана, используя потоки, и сохраняю их в локальном состоянии основного экрана и показываю все, что нужно показать на это.

Я прикрепляю код ниже:

Это основной файл, в котором я использую стек и анимацию, чтобы заставить UI работать:

main file

Вот как я регистрирую отзывы пользователей и отправляю их на главный экран, используя потоки:

enter image description here

И это как я получаю отзывы и показываю, какая страница должна отображаться:

enter image description here

Вот как выглядит мой класс stream / blo c:

enter image description here

Мой главный вопрос здесь о подходе, есть ли лучший способ сделать это? Я спрашиваю об этом, потому что знаю, что потоки нельзя оставлять открытыми, а это влияет на производительность приложения. Но при таком подходе я должен все время оставлять его открытым, поскольку пользователь должен иметь возможность выбрать нужную страницу в любой момент времени.

Это нормальная практика - оставлять потоки open в таком сценарии ios, можете ли вы рассказать мне о некоторых случаях, когда потоки должны оставаться открытыми, если такие случаи существуют? (Например, я думаю, что autosuggest / search-as-you-type может использовать потоки все время, не так ли?).

Ответы [ 2 ]

1 голос
/ 15 мая 2020

Да, вы можете оставить поток открытым. но это повлияет на производительность вашего приложения, и, на мой взгляд, это сложный подход для простого обратного вызова. Вот что я бы сделал:

** на странице ящика: // добавляем параметр обратного вызова

final Function(Widget w) onItemTap;

// добавляем обратный вызов в конструктор ящика

Drawer(this.onItemTap);

** в детекторе жестов ящика: // при нажатии на элемент отправьте этот обратный вызов на страницу, на которой вы создали экземпляр страницы ящика.

onTap(){ widget.onItemTap( WidgetToShow() ) },

Теперь, когда вы создаете экземпляр класса ящика в любом месте на вашем главном экране у вас есть параметр обратного вызова, который вы можете использовать следующим образом:

Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  )

Итак, вот ваш последний код ящика / меню:

class Drawer extends StatefulWidget {
final Function(Widget w) onItemTap;
Drawer(this.onItemTap);
}
// ....
GestureDetector(
onTap: (){ return widget.onItemTap( WidgetToShow() ); },
),
// ...

, а вот код вашего основного экрана:

// ...
stack(
children:[
Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  ),
]
),
//...

Надеюсь, что помогло :)

0 голосов
/ 10 мая 2020

короткий ответ? Да, вы можете оставить поток открытым. но это повлияет на производительность вашего приложения, и, на мой взгляд, это сложный подход для простого обратного вызова. Вот что я бы сделал:

** на странице ящика: // добавляем параметр обратного вызова

final Function(Widget w) onItemTap;

// добавляем обратный вызов в конструктор ящика

Drawer(this.onItemTap);

** в детекторе жестов ящика: // при нажатии на элемент отправьте этот обратный вызов на страницу, на которой вы создали экземпляр страницы ящика.

onTap(){ widget.onItemTap( WidgetToShow() ) },

Теперь, когда вы создаете экземпляр класса ящика в любом месте на вашем главном экране у вас есть параметр обратного вызова, который вы можете использовать следующим образом:

Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  )

Итак, вот ваш последний код ящика / меню:

class Drawer extends StatefulWidget {
final Function(Widget w) onItemTap;
Drawer(this.onItemTap);
}
// ....
GestureDetector(
onTap: (){ return widget.onItemTap( WidgetToShow() ); },
),
// ...

, а вот код вашего основного экрана:

// ...
stack(
children:[
Drawer( onItemTap:(Widget w){ 
// now you have your widget in the mainScreen, do as you want with it 
}  ),
]
),
//...

Надеюсь, что помогло :)

...