首页 > 解决方案 > 在颤振中使用 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

多谢

标签: androidiosdartflutter

解决方案


根据检查,flutter_swipercard_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(),
      ),
    );
  }
}

在此处输入图像描述


推荐阅读