为什么使用ChangeNotifierProvider在ChangeNotifier类中未更新我的“数据”。“数据”?

时间:2020-04-13 15:49:29

标签: flutter flutter-provider flutter-change-notifier

我是新手。 我想问为什么我的文本字段的onChange没有触发:“ Provider.ofContext).updateData(newString);”。 我的Provider.of(context).data的值未更新,并且使用2条打印语句,始终仅打印出“ called1”。

这是代码: 导入'package:flutter / material.dart'; 导入'package:provider / provider.dart';

Imports System.IO

Public Class PictureBoxEx
    Inherits PictureBox

    Private _imageStream As Stream

    Public WriteOnly Property ImageStream As Stream
        Set
            _imageStream = Value
            Image = Image.FromStream(Value)
        End Set
    End Property

    Public Sub DisposeImageAndStream()
        Image?.Dispose()
        _imageStream?.Dispose()
    End Sub

End Class

1 个答案:

答案 0 :(得分:1)

您正在尝试在声明的同一小部件​​中访问提供程序,这是不正确的方法,提供商必须在上面的小部件中声明要访问的位置。

此外,始终按变量使用提供者数据(如MyTextField小部件中使用的那样),否则它将不起作用。

以下代码可以帮助您了解更多。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      create: (_) => Data(),
      child: MaterialApp(home: Level1()),
    );
  }
}

class Level1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(Provider.of<Data>(context).data),
      ),
      body: Level2(),
    );
  }
}

class Level2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        MyTextField(),
      ],
    );
  }
}

class MyTextField extends StatelessWidget {
  var dataprovider;
  @override
  Widget build(BuildContext context) {
    dataprovider = Provider.of<Data>(context);
    return TextField(
      onChanged: (newString) {
        print(dataprovider.data);
        dataprovider.updateData(newString);
        print('called2');
      },
    );
  }
}

class Data extends ChangeNotifier {
  String data = '1234567890';

  void updateData(newString) {
    print("cds");
    data = newString;
    notifyListeners();
  }
}