Внешний вид перестройки во FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Внешний вид перестройки во Flutter

Сообщение Anonymous »

Контекст
У меня есть приложение Flutter, и главный экран приложения — это Scaffold с телом PageView — BottomNavigationBar с четырьмя дочерними элементами:

Код: Выделить всё

// page declaration
@override
void initState() {
super.initState();
_children = [
const Page1(),
const Page2(),
const Page3(),
const Page4(),
];
}

// body
SafeArea(
child: PageView(
physics: NeverScrollableScrollPhysics(),
controller: _pageController, // just a PageController
children: _children,
onPageChanged: _onPagechanged,
),
)
// bottom nav bar
BottomNavigationBar(
showSelectedLabels: false,
showUnselectedLabels: false,
backgroundColor: Colors.white,
type: BottomNavigationBarType.fixed,
items: [
icon1, icon2, icon3, icon4,
],
currentIndex: _selectedIndex,
onTap: _onItemTapped,
)

int _selectedIndex = 0; // starts at 0

void _onItemTapped(int index) {
_pageController.jumpToPage(index);
}

void _onPagechanged(int index) {
setState(() => _selectedIndex = index);
}
Каждая дочерняя страница создается с использованием конструктора const, представляет собой виджет с отслеживанием состояния и используется с AutoKeepAliveClientMixin и этим битом кода:

Код: Выделить всё

@override
bool get wantKeepAlive => true;
В дереве есть несколько виджетов с сохранением состояния, которые используют вызов API для загрузки изображения из Интернета в переменную состояния Uint8List. Изначально эта переменная равна нулю, и я использую переопределение initState, чтобы выполнить вызов, а затем обновить переменную:

Код: Выделить всё

@override
void initState() {
_loadImage();
super.initState();
}

Future _loadImage() async {
final resourcePath = widget.item.imageUrl;
final up = Provider.of(context, listen: false);

final fbss = FirebaseStorageService(up.uid);
final image = await fbss.getResourceWithCache(resourcePath, isItem: true, saveToCache: false);
setState(() {
_image = image;
_isLoaded = true;
});
}
Пока переменная состояния равна нулю (и выполняется вызов API), я показываю круговой индикатор прогресса; когда изображение загружено и больше не равно нулю, я использую изображение в контейнере в качестве декоративного изображения для виджета BoxDecoration. Цвет виджета BoxDecoration — Colors.grey.
Проблема
Всякий раз, когда я перехожу от одного экрана к другому, а затем возвращаюсь назад, те виджеты, которые выполняют вызовы API и загружают изображения, мигают серым, а затем изображение снова рисуется на виджете. Почему это? Есть ли способ загрузить его, чтобы этого не произошло? Я знаю, что всякий раз, когда я меняю экран, я смотрю на виджет, который удерживает каркас с нижней панелью навигации, перестраивается из-за изменения состояния, но почему из-за этого кажется, что изображения перестраиваются? Я проверил, что эти виджеты с изображениями не на самом деле перестраиваются, но похоже, что они это делают. Я хотел бы предотвратить такое поведение. Нужно ли мне использовать маршруты и навигатор на своих страницах? Что поможет предотвратить появление перезагрузки при каждом переключении пользователя между экранами?

Подробнее здесь: https://stackoverflow.com/questions/779 ... in-flutter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»