Flutter:如何将Provider.of方法正确地放置在StatefulWidget中,以便可以在我的代码中使用Dispose()?

问题描述 投票:0回答:1

Introduction:我花了一个多小时来查看StackOverflow来寻找答案;因此,我犹豫不决地决定问这个问题,我认为这个问题没有答案。我希望它不会重复已被Ad Nauseam回答的问题。

[我已经花了过去的五周时间沉迷于BLoC模式的研究(是的,我知道我落后曲线约一年了)。我一直在看几个视频,并读了几本有关该主题的书。我了解到,如果没有调用dispose方法,则会发生内存泄漏。在我最近观看的许多YouTube视频中,建议使用有状态的小部件而不是无状态的小部件,以便可以在应用程序的生命周期中使用dispose方法来防止内存泄漏。

问题:安置继承的窗口小部件的正确方法是什么,via Provide.of方法,以获得有状态窗口小部件的上下文范围,因此dispose()方法可以是在生命周期中使用?

相关代码:

import 'package:flutter/material.dart';

import 'package:testingblock6/counter_provider.dart';
import 'counter_event.dart';
import 'model.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    final _bloc = Provider.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Testing Bloc 6'),
      ),
      body: Center(
          child: StreamBuilder<Model>(
        stream: _bloc.modelStream,
        initialData: Model(),
        builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
          return Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                'Counter: ${snapshot.data.counter}',
                style: Theme.of(context).textTheme.display1,
              ),
              Text(
                'ThisGuy: ${snapshot.data.thisGuy}',
                style: Theme.of(context).textTheme.display1,
              ),
            ],
          );
        },
      )),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(IncrementEvent()),
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
          SizedBox(width: 10),
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(DecrementEvent()),
            tooltip: 'Decrement',
            child: Icon(Icons.remove),
          ),
          SizedBox(width: 10),
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(ThisGuy()),
            tooltip: 'ThisGuy',
            child: Icon(Icons.golf_course),
          ),
        ],
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  @override
  void dispose() {
    super.dispose();
    // _bloc.dispose();
  }
}

问题:我认为必须在代码的_HomeState区域内部调用Provider.of方法,因为这是上下文可用的地方。但是,这样做可以将其从dispose方法的范围中删除。

问题:关于dispose()方法范围的可用性,我在做错什么,对此我没有看到答案吗?

flutter scope dispose bloc inherited-widget
1个回答
1
投票
import 'package:flutter/material.dart';

import 'counter_event.dart';
import 'counter_provider.dart';
import 'model.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var _bloc;

  @override
  Widget build(BuildContext context) {
    _bloc = Provider.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Testing Bloc 6'),
      ),
      body: Center(
          child: StreamBuilder<Model>(
        stream: _bloc.modelStream,
        initialData: Model(),
        builder: (BuildContext context, AsyncSnapshot<Model> snapshot) {
          return Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                'Counter: ${snapshot.data.counter}',
                style: Theme.of(context).textTheme.display1,
              ),
              Text(
                'ThisGuy: ${snapshot.data.thisGuy}',
                style: Theme.of(context).textTheme.display1,
              ),
            ],
          );
        },
      )),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(IncrementEvent()),
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
          SizedBox(width: 10),
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(DecrementEvent()),
            tooltip: 'Decrement',
            child: Icon(Icons.remove),
          ),
          SizedBox(width: 10),
          FloatingActionButton(
            onPressed: () => _bloc.counterEventSink.add(ThisGuy()),
            tooltip: 'ThisGuy',
            child: Icon(Icons.golf_course),
          ),
        ],
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  @override
  void dispose() {
    super.dispose();
    _bloc.dispose();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.