Provider: Provider.of provide previous value

Created on 15 Jan 2020  路  5Comments  路  Source: rrousselGit/provider

Hello.

I am use Provider 4.0.1 and faced with problem.

Provider.of provide previous value in didChangeDependencies

And same call of Provider.of in build method ( for debug purpose ) show right new value.

In Provider 3.2.0 all is okay.

I provide my value in root of app using Provider.value wrapped in MultiProvider.

Code look like this:

image

bug

All 5 comments

Hello!

I don't understand what you meant.
Do you mind sharing a small snippet to reproduce the issue and explain what's expected?

I created sample to reproduce. Hope it'll help. Provider version: 4.0.1.

Try to switch Switch widget and see on values. I expect equals values, but they are different.

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(MyApp());

StreamController<bool> isDarkThemeStreamController = StreamController();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<bool>(
        stream: isDarkThemeStreamController.stream,
        initialData: true,
        builder: (context, snapshot) {
          return Provider.value(
            value: snapshot.data,
            child: MaterialApp(
              title: 'Provider bug example',
              theme: ThemeData(
                primarySwatch: Colors.blue,
              ),
              home: MyHomePage(),
            ),
          );
        });
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isDarkThemeFromDidChangeDependencies;

  @override
  void didChangeDependencies() {
    isDarkThemeFromDidChangeDependencies = Provider.of<bool>(context);
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Provider bug example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: <Widget>[
            Text("Switch for dark theme:"),
            Switch(
              value: Provider.of<bool>(context),
              onChanged: isDarkThemeStreamController.sink.add,
            ),
            Text(
                "isDarkTheme from didChangeDependencies: $isDarkThemeFromDidChangeDependencies"),
            Text("isDarkTheme from build: ${Provider.of<bool>(context)}"),
          ],
        ),
      ),
    );
  }
}

Thanks, I will check that out

Ok I've managed to reproduce the issue.
Ironically I've also fixed it by accident when working on the 4.1.0

So I've got the fix down. I'll extract it from the WIP 4.1.0, and publish a 4.0.2

Thanks. I'll wait for 4.0.2:)

Was this page helpful?
0 / 5 - 0 ratings