android - 在颤振中使用 swipper 时发生错误
问题描述
我使用 SliverList 隐藏 swiper 但它给了我关于 swiper 控制器的错误(我认为)状态未保存或帮助我修复它,非常感谢
用户界面代码
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:medixa_app/Routes/CategoryRoute.dart';
class HomeTab extends StatefulWidget {
@override
_HomeTabState createState() => _HomeTabState();
}
class _HomeTabState extends State<HomeTab> {
var names = [
'INFO',
'ABOUT',
'EVO',
'CONTACT US',
];
var links = [
'https://images.pexels.com/photos/1282308/pexels-photo-1282308.jpeg?auto=compress&cs=tinysrgb&h=650&w=940',
'https://images.pexels.com/photos/40568/medical-appointment-doctor-healthcare-40568.jpeg?auto=compress&cs=tinysrgb&h=650&w=940',
'https://images.pexels.com/photos/935869/pexels-photo-935869.jpeg?auto=compress&cs=tinysrgb&h=650&w=940',
];
var swiperController;
List<StackFit> stackList = [StackFit.expand, StackFit.loose];
@override
void initState() {
super.initState();
swiperController = SwiperControl(
iconPrevious: null,
iconNext: null,
);
}
@override
Widget build(BuildContext context) {
return Material(
child: Container(
child: CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
<Widget>[
Container(
height: 50.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: names.length,
itemBuilder: (context, i) => new MenuItem(names[i], i),
),
),
new Container(
height: 150.0,
child: Swiper(
loop: false,
autoplay: true,
itemBuilder: (context, i) {
return Stack(
alignment: AlignmentDirectional.bottomStart,
fit: StackFit.expand,
children: <Widget>[
Image.network(
links[i],
fit: BoxFit.cover,
),
Container(
alignment: AlignmentDirectional.bottomStart,
child: Container(
constraints:
BoxConstraints(minWidth: double.maxFinite),
padding: EdgeInsets.symmetric(
vertical: 8.0, horizontal: 16.0),
color: Colors.black54,
child: Text(
'Descreption: ${i}',
style: TextStyle(
color: Colors.white,
),
textAlign: TextAlign.justify,
),
),
)
],
);
},
itemCount: links.length,
pagination: new SwiperPagination(),
control: swiperController,
),
),
],
addAutomaticKeepAlives: true,
addRepaintBoundaries: false
),
),
SliverList(
delegate: SliverChildBuilderDelegate((context, i) {
return new Container(
height: 80.0,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Row(
children: <Widget>[
Icon(
Icons.account_circle,
color: Colors.deepPurple[((i + 1) % 10) * 100],
size: 48.0,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Center(
child: Text('Title: ${i + 1}'),
),
)
],
),
),
);
}, childCount: 20),
)
],
),
),
);
}
}
class MenuItem extends StatelessWidget {
final String title;
final int id;
MenuItem(this.title, this.id);
@override
Widget build(BuildContext context) {
return Material(
child: Card(
margin: EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 8.0,
),
child: InkWell(
onTap: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => new CategoryRoute(title, id)));
},
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(title),
),
),
),
),
);
}
}
错误
I/颤振(2601):══╡基金会图书馆发现异常╞═════════════════════════════════════════════ ══════════════════════ I/flutter(2601):为 SwiperController 调度通知时引发以下断言:I/flutter(2601):查找停用的小部件的祖先是不安全的。I/flutter (2601):此时小部件的元素树的状态不再稳定。要在其 dispose() 方法中安全地引用 I/flutter ( 2601): 小部件的祖先,请通过在小部件的 didChangeDependencies() 方法中调用 I/flutter ( 2601): inheritFromWidgetOfExactType() 来保存对祖先的引用。I/flutter (2601): 当异常被抛出时,这是堆栈: I/flutter (2601): #0 Element._debugCheckStateIsActiveForAncestorLookup。(包:flutter/src/widgets/framework.dart:3233:
依赖:
flutter_swiper : ^1.1.4
多谢
解决方案
根据检查,flutter_swiper是card_swiper插件的旧版本。最新的插件现在兼容 Flutter 的 null 安全特性,我推荐使用最新的插件,因为它更稳定。关于错误的复制,当我使用最新插件时,您发布的错误未显示。
这是插件本身的示例:
import 'package:flutter/material.dart';
import 'package:card_swiper/card_swiper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Swiper(
itemBuilder: (BuildContext context, int index) {
return Image.network(
"https://via.placeholder.com/350x150",
fit: BoxFit.fill,
);
},
itemCount: 3,
pagination: SwiperPagination(),
control: SwiperControl(),
),
);
}
}
推荐阅读
- spring-data - 有没有办法在 Spring Data MongoDB 中不使用 @Version 注释来配置版本属性?
- algorithm - N级字符串压缩:解压缩算法
- python - 从另一个数组中的数组中查找不存在的字段
- python - 如何使节点 a 和 f 的颜色不同?
- javascript - Javascript:访问数组中的子对象
- flutter - Flutter Injectable:通过注解注入多个泛型类型实例
- kentico - 编写适用于本地化模块文本的链接
- wordpress - 预加载本地网络字体时可以/应该使用 &display=swap 参数吗?
- airflow - Apache 气流 2.0 CORS 问题
- reactjs - 如何在 React Material ui 中为 Card 组件设置边框颜色