我是新手。 我想问为什么我的文本字段的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
答案 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();
}
}