【问题标题】:Listview Builder causing reload Consumer in FlutterListview Builder 导致 Flutter 中重新加载消费者
【发布时间】:2020-05-15 20:24:36
【问题描述】:

我在 Consumer 中使用 Listview,当我向下滚动时,它会重新加载 Consumer 提供程序。

这是我的完整代码。

class UnitScreen extends StatefulWidget {
  @override
  _UnitScreenState createState() => _UnitScreenState();
}

class _UnitScreenState extends State<UnitScreen> {
  Future<void> _getUnits(BuildContext context) async {
    return Provider.of<UnitProvider>(context, listen: false).getUnits();
  }

  Widget _buildUnits(List<Unit> units) {
    return ListView.builder(
      itemCount: units.length,
      itemBuilder: (BuildContext ctx, index) => DisplayItem(
        title: units[index].name,
        id: units[index].id
      ),
    );
  }

  @override
  void initState() {
    Future.delayed(Duration.zero, () {
      _getUnits(context);
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    print('inside build');
    return Scaffold(
        appBar: SearchableAppBar(
          title: "Unit"
        ),
        drawer: AppDrawer(),
        body: RefreshIndicator(
            onRefresh: () => _getUnits(context),
            child: Consumer<UnitProvider>(builder: (ctx, snapshot, child) {
              print('inside consumer');
              switch (snapshot.unitList.status) {
                case Status.LOADING:
                  return Center(child: CircularProgressIndicator());
                  break;
                case Status.COMPLETED:
                  return _buildUnits(snapshot.unitList.data);
                  break;
                default:
                  return ErrorWithRetry();
              }
            }));
  }
}

加载单元后,当我向下滚动时,它会重新加载消费者,如您所见,我在消费者内部调用了 print 方法,并且可以在调试控制台中多次看到消费者内部。 p>

我是新手,所以这是默认行为还是我在这里做错了什么?

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    我认为这样做更好(将实例添加到您的类并直接从您的类中调用方法):

     Widget build(BuildContext context) {
        return ChangeNotifierProvider<UnitProvider>( 
          create: (context) => UnitProvider.instance(),
          child: Scaffold(
            appBar: SearchableAppBar(
              title: "Unit"
            ),
            drawer: AppDrawer(),
            body: Consumer<UnitProvider>(builder: (context, snapshot, child) { 
            return RefreshIndicator(
                onRefresh: () => snapshot.getUnits(context),
                child: 
    

    【讨论】:

    • 现在您可以将视图与模型完全分离,这是超级干净的代码,并且您尊重 MVC 或 MVVM 之类的软件模式或...
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2017-11-17
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2014-10-05
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多