Я пытаюсь реализовать DraggableScrollableSheet с двумя вложенными прокручиваемыми списками.
Я не могу использовать готовый класс NestedScrollView (я уже пробовал его, но мне не удалось заставить его работать, поскольку он, похоже, создан для одной предыдущей полосы заголовка и только одного прокручиваемого списка).
Мой подход с классом CustomScrollView обычно работает, но, к сожалению, возникает другая проблема: каждый раз, когда пользователь перетаскивает лист, все фрагменты восстанавливаются с каждым кадром. Что ужасно медленно.
Я открыл простой тестовый пример, чтобы исключить, что это не ошибка какой-либо сложной логики виджетов / поставщиков / потребителей и т. Д. Даже с этими простыми виджетами все фрагменты восстанавливаются один раз за кадр ...
Это ошибка во фреймворке или что я здесь делаю не так?
Большое тебе спасибо...
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: DraggableScrollableActuator(child: MyHomePage(title: 'Flutter Demo Home Page')),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
AnimationController _controller;
Tween<Offset> _tween = Tween(begin: Offset(0, 1), end: Offset(0, 0));
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: Duration(milliseconds: 300));
}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(children: [
SlideTransition(
position: _tween.animate(_controller),
child: MyPopUpSheet(),
),
Center(
child: IconButton(
icon: const Icon(Icons.info),
onPressed: () {
setState(() {
if (_controller.isDismissed)
_controller.forward();
else if (_controller.isCompleted) _controller.reverse().then((value) => _controller.reset());
});
}),
),
]));
}
}
class MyPopUpSheet extends StatelessWidget {
ScrollController _scrollController; //Needed for
@override
Widget build(BuildContext context) {
print("MyPopUpSheet.build()");
return Material(
elevation: 4,
shadowColor: Colors.orange,
child: DraggableScrollableSheet(
expand: true,
initialChildSize: 0.4,
minChildSize: 0.4,
maxChildSize: 1.0,
builder: (ctx, scrollController) {
_scrollController = scrollController;
return CustomScrollView(
shrinkWrap: true,
controller: _scrollController,
slivers: [
SliverToBoxAdapter(child: Test(Colors.deepOrange)),
SliverToBoxAdapter(child: Test(Colors.red)),
SliverToBoxAdapter(child: Test(Colors.green)),
SliverToBoxAdapter(child: Test(Colors.purpleAccent)),
SliverToBoxAdapter(child: Test(Colors.amberAccent))
],
);
},
),
);
}
}
class Test extends StatelessWidget {
final Color color;
Test(this.color);
@override
Widget build(BuildContext context) {
print("Test.build()");
return Container(height: 100, color: color);
}
}