Size: a a a

Flutter Developers — русскоговорящее сообщество

2021 January 20

G

Givi in Flutter Developers — русскоговорящее сообщество
Вот пример который описывает проблему:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

/// This is the main application widget.
class MyApp extends StatelessWidget {
 static const String _title = 'Flutter Code Sample';

 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     title: _title,
     home: MyStatefulWidget(),
   );
 }
}

/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
 MyStatefulWidget({Key key}) : super(key: key);

 @override
 _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
 List<int> top = [0, -1,-2,-3,-4];
 List<int> bottom = [1,2,3,4,5];

 @override
 Widget build(BuildContext context) {
   const Key centerKey = ValueKey('bottom-sliver-list');
   return Scaffold(
     appBar: AppBar(
       title: const Text('Press on the plus to add items above and below'),
       leading: IconButton(
         icon: const Icon(Icons.add),
         onPressed: () {
           setState(() {
             top.add(-top.length - 1);
             if (bottom.isNotEmpty) {
               bottom.removeLast();
             } else {
               top.removeAt(0);
             }
           });
         },
       ),
     ),
     body: CustomScrollView(
       center: centerKey,
       slivers: <Widget>[
         SliverList(
           delegate: SliverChildBuilderDelegate(
             (BuildContext context, int index) {
               return Container(
                 alignment: Alignment.center,
                 color: Colors.blue[200 + top[index] % 4 * 100],
                 height: 100 + top[index] % 4 * 20.0,
                 child: Text('Item: ${top[index]}'),
               );
             },
             childCount: top.length,
           ),
         ),
         SliverList(
           key: centerKey,
           delegate: SliverChildBuilderDelegate(
             (BuildContext context, int index) {
               return Container(
                 alignment: Alignment.center,
                 color: Colors.blue[200 + bottom[index] % 4 * 100],
                 height: 100 + bottom[index] % 4 * 20.0,
                 child: Text('Item: ${bottom[index]}'),
               );
             },
             childCount: bottom.length,
           ),
         ),
       ],
     ),
   );
 }
}


По клику на + он добавляет в верхний SliverList один элемент и удаляет последний элемент в нижнем. До тех пор пока есть что удалять в нижнем, ScrollPosition не меняется, когда начинаем одновременно добавлять удалять в разных концах одного и того же SliverList, то Начинает скроллить наверх автоматически.
источник

G

Givi in Flutter Developers — русскоговорящее сообщество
источник

PP

Pavel Pimenov in Flutter Developers — русскоговорящее сообщество
Givi
Вот пример который описывает проблему:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

/// This is the main application widget.
class MyApp extends StatelessWidget {
 static const String _title = 'Flutter Code Sample';

 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     title: _title,
     home: MyStatefulWidget(),
   );
 }
}

/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
 MyStatefulWidget({Key key}) : super(key: key);

 @override
 _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
 List<int> top = [0, -1,-2,-3,-4];
 List<int> bottom = [1,2,3,4,5];

 @override
 Widget build(BuildContext context) {
   const Key centerKey = ValueKey('bottom-sliver-list');
   return Scaffold(
     appBar: AppBar(
       title: const Text('Press on the plus to add items above and below'),
       leading: IconButton(
         icon: const Icon(Icons.add),
         onPressed: () {
           setState(() {
             top.add(-top.length - 1);
             if (bottom.isNotEmpty) {
               bottom.removeLast();
             } else {
               top.removeAt(0);
             }
           });
         },
       ),
     ),
     body: CustomScrollView(
       center: centerKey,
       slivers: <Widget>[
         SliverList(
           delegate: SliverChildBuilderDelegate(
             (BuildContext context, int index) {
               return Container(
                 alignment: Alignment.center,
                 color: Colors.blue[200 + top[index] % 4 * 100],
                 height: 100 + top[index] % 4 * 20.0,
                 child: Text('Item: ${top[index]}'),
               );
             },
             childCount: top.length,
           ),
         ),
         SliverList(
           key: centerKey,
           delegate: SliverChildBuilderDelegate(
             (BuildContext context, int index) {
               return Container(
                 alignment: Alignment.center,
                 color: Colors.blue[200 + bottom[index] % 4 * 100],
                 height: 100 + bottom[index] % 4 * 20.0,
                 child: Text('Item: ${bottom[index]}'),
               );
             },
             childCount: bottom.length,
           ),
         ),
       ],
     ),
   );
 }
}


По клику на + он добавляет в верхний SliverList один элемент и удаляет последний элемент в нижнем. До тех пор пока есть что удалять в нижнем, ScrollPosition не меняется, когда начинаем одновременно добавлять удалять в разных концах одного и того же SliverList, то Начинает скроллить наверх автоматически.
Я немного о другом: при использовании builder, возможно, и не будет необходимости в удалении элементов с другого конца
(Потому что элементы, не попадающие на экран, и так не будут тратить ресурсы)
источник

G

Givi in Flutter Developers — русскоговорящее сообщество
Pavel Pimenov
Я немного о другом: при использовании builder, возможно, и не будет необходимости в удалении элементов с другого конца
(Потому что элементы, не попадающие на экран, и так не будут тратить ресурсы)
Ты прав, это так, но делов том что я определенное количество элементов храню в датасорсе в памяти, а остальное все лежит в базе. Мне придётся детектить в определенных позициях скролла что элементы закончились и я должен запросить их из базы асинхронно, а builder то будет ждать элементы синхронно
источник

PP

Pavel Pimenov in Flutter Developers — русскоговорящее сообщество
Givi
Ты прав, это так, но делов том что я определенное количество элементов храню в датасорсе в памяти, а остальное все лежит в базе. Мне придётся детектить в определенных позициях скролла что элементы закончились и я должен запросить их из базы асинхронно, а builder то будет ждать элементы синхронно
Но ведь эта проблема не связана с builder 🤔
источник

G

Givi in Flutter Developers — русскоговорящее сообщество
Ну да не связана, просто ребята советовали билдер, а ведь я и так его юзаю
источник

G

Givi in Flutter Developers — русскоговорящее сообщество
Дело в логике изменения скролл позиции в CustomScrollView
источник
2021 January 21

V

Victor in Flutter Developers — русскоговорящее сообщество
Подскажите плз почему во флаттере не разогретые анимации даже самые простые подлагивают? Даже в веб браузере на том же телефоне такие анимации будут плавными без will change, а тут пока шейдеры не скомпилены совсем беда.
источник

IH

Ilya Hrankouski in Flutter Developers — русскоговорящее сообщество
Victor
Подскажите плз почему во флаттере не разогретые анимации даже самые простые подлагивают? Даже в веб браузере на том же телефоне такие анимации будут плавными без will change, а тут пока шейдеры не скомпилены совсем беда.
Это известная проблема, над ней вроде работают, но до сих пор не исправили, и ничего с этим поделать нельзя
источник

P

Pa_blooo in Flutter Developers — русскоговорящее сообщество
Victor
Подскажите плз почему во флаттере не разогретые анимации даже самые простые подлагивают? Даже в веб браузере на том же телефоне такие анимации будут плавными без will change, а тут пока шейдеры не скомпилены совсем беда.
можно же разогреть чуток
источник

P

Pa_blooo in Flutter Developers — русскоговорящее сообщество
на андройде говорят помогает
источник

P

Pa_blooo in Flutter Developers — русскоговорящее сообщество
на ios неа
источник

V

Victor in Flutter Developers — русскоговорящее сообщество
Pa_blooo
можно же разогреть чуток
да это я нашел, просто удивительно что там такого может лагать в простых анимациях
по идее разогрев нужен для реально сложного
источник

P

Pa_blooo in Flutter Developers — русскоговорящее сообщество
беда есть, все ждем
источник

SD

Stas Den in Flutter Developers — русскоговорящее сообщество
В bloc нельзя переопределить:
@override
Stream<Transition<Event, State>> transformEvents(
 events, transitionFn) {
return events.switchMap(transitionFn);
}
Пишет ошибку:
The method 'switchMap' isn't defined for the type 'Stream'
Я так понимаю, что это как-то связано с тем, что Observable заменили на Strem
Никто не сталкивался?
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Stas Den
В bloc нельзя переопределить:
@override
Stream<Transition<Event, State>> transformEvents(
 events, transitionFn) {
return events.switchMap(transitionFn);
}
Пишет ошибку:
The method 'switchMap' isn't defined for the type 'Stream'
Я так понимаю, что это как-то связано с тем, что Observable заменили на Strem
Никто не сталкивался?
Из какого века пишешь?)
В rxdart уже давным давно нет такого понятия как Observable
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Со времен как добавили method extensions
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Stas Den
В bloc нельзя переопределить:
@override
Stream<Transition<Event, State>> transformEvents(
 events, transitionFn) {
return events.switchMap(transitionFn);
}
Пишет ошибку:
The method 'switchMap' isn't defined for the type 'Stream'
Я так понимаю, что это как-то связано с тем, что Observable заменили на Strem
Никто не сталкивался?
ты rxdart мб забыл импортировать?)
источник

SD

Stas Den in Flutter Developers — русскоговорящее сообщество
rxdart не импортировал
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Stas Den
rxdart не импортировал
И кто в этом виноват?)
источник