Вы можете использовать виджет «Стек», чтобы расположить кнопку в верхнем правом углу вашего строительного объекта.
Попробуйте что-то вроде:
Stack(children: [
Positioned(
// set appropriate positioning
CustomButton(..),
)
TabBar(
controller: _controller,
isScrollable: true,
tabs: <Widget>[
Tab(text: 'category_1'),
Tab(text: 'category_2'),
Tab(text: 'category_3'),
Tab(text: 'category_4'),
Tab(text: 'category_5'),
Tab(text: 'category_6'),
Tab(text: 'category_7'),
Tab(text: 'category_8'),
Tab(text: 'category_9'),
],
),
])
После того, как вы настроите нижнюю часть, вы также можете использовать стек на своем теле, чтобы отобразить панель, и функция кнопки onTap будет использоваться переключить его видимость
Может случиться, что вы работаете с вашим конкретным компилятором и компьютером, но вы не должны на это рассчитывать.
Поведение вашего кода в соответствии со спецификацией языка C является undefined . Это означает, что он может делать то, что вы надеетесь, или он может вызвать сбой вашего компьютера, или это может привести к тому, что демоны вылетят из носа .
В отличие от языков более высокого уровня, таких как Java и C #, C доверяет вам и не выполняет явных проверок границ массивов. Вы должны нести ответственность и не выходить за пределы массива.
Это «работает», только если ваше определение «работает» является синонимом «еще не разбился».
«Но почему это так?»
Потому что такова С.
Границы массива не проверяются во время выполнения.
Это «Закон С»
Вы видите неопределенное поведение , вызванное доступом к массиву с недопустимым индексом. Неопределенное поведение означает, что может произойти все что угодно, в том числе ваша программа работает правильно.
Я просто хотел бы отметить, что все это действительно не определено. Ваш пример «работает» в этом конкретном примере, потому что обе переменные расположены в стеке. То есть адрес cnt находится чуть ниже конца массива. Когда cnt достигает cnt == 5 массив операторов [cnt] = cnt; не записывает в память, выделенную для массива, а сразу после него, где лежит адрес cnt. Это просто удача, что это не меняет ваш счетчик. Когда cnt> 5, нет памяти для мусора, и он просто запишет в «стек пустых» (не знаю правильное слово).
еще один пример, чтобы проиллюстрировать это:
int main(int ac,char **av)
{
int a[5];
int cnt;
int cnt2=3;
for(cnt=0;cnt<7;cnt++) {
a[cnt]=cnt;
printf("%d %d %d\n", a[cnt], cnt, cnt2);
}
}
output:
0 0 3
1 1 3
2 2 3
3 3 3
4 4 3
5 5 5
6 6 5
Последний две записи цикла перезаписывают данные стека после [] и могут привести к очень запутанным ошибкам. В этом случае cnt2 уничтожается.
Массивы в C не проверяются во время выполнения. Другими словами, вы можете «определить» массив размера N и получить доступ к концу конца массива. Если вы выходите из конца массива, то вы удаляете память где-то в стеке (или куче).
Как только вы очистите память где-нибудь, ваша программа, вероятно, вылетит. Эти сбои трудно отследить, потому что они могут дойти далеко от того места, где вы на самом деле пересекали конец массива.
Обычно, когда вы объявляете массивы в C, лучше использовать какую-то константу или #define, чтобы отметить размер массива:
#define MAX_ELEMENTS 10
int array[MAX_ELEMENTS];
int cnt;
for(cnt = 0; cnt < MAX_ELEMENTS; cnt+=1) {
array[cnt] = cnt;
}
Если вы пропустите MAX_ELEMENTS в присваивании массива, вы можете перезаписать значение cnt. Вы можете перезаписать другую переменную. Все зависит от компилятора и структуры кода. Также обратите внимание на использование знака <в цикле for. Массивы C основаны на 0, поэтому вы должны проверять, используя меньше или меньше или меньше.
Границы массива в C не обязательно проверяются во время выполнения. Стандарт оставляет разработчикам свободу делать это, если они выбирают или нет - это часть того, что не определено . В реализации с жирными указателями образец действительно может вызвать какую-то ошибку.
Как только вы запускаете конец массива, вы перезаписываете память, которую программное обеспечение не ожидает, и разрушает кучу. Ваше программное обеспечение может продолжать работать, но оно будет очень нестабильным!
Зависит от того, как упакована стековая память. Кроме того, он с радостью перезапишет эти значения и даже прочитает их, но, скорее всего, вы повредите стек.